1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-05 19:35:52 +03:00

elf: Introduce enum opt_format in the ldconfig implementation

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
This commit is contained in:
Florian Weimer
2020-11-26 16:59:44 +01:00
parent 603ae243f6
commit db07fae825
3 changed files with 24 additions and 18 deletions

View File

@@ -321,13 +321,13 @@ save_cache (const char *cache_name)
struct cache_file *file_entries = NULL; struct cache_file *file_entries = NULL;
size_t file_entries_size = 0; size_t file_entries_size = 0;
if (opt_format != 2) if (opt_format != opt_format_new)
{ {
/* struct cache_file_new is 64-bit aligned on some arches while /* struct cache_file_new is 64-bit aligned on some arches while
only 32-bit aligned on other arches. Duplicate last old only 32-bit aligned on other arches. Duplicate last old
cache entry so that new cache in ld.so.cache can be used by cache entry so that new cache in ld.so.cache can be used by
both. */ both. */
if (opt_format != 0) if (opt_format != opt_format_old)
cache_entry_old_count = (cache_entry_old_count + 1) & ~1; cache_entry_old_count = (cache_entry_old_count + 1) & ~1;
/* And the list of all entries in the old format. */ /* And the list of all entries in the old format. */
@@ -345,7 +345,7 @@ save_cache (const char *cache_name)
struct cache_file_new *file_entries_new = NULL; struct cache_file_new *file_entries_new = NULL;
size_t file_entries_new_size = 0; size_t file_entries_new_size = 0;
if (opt_format != 0) if (opt_format != opt_format_old)
{ {
/* And the list of all entries in the new format. */ /* And the list of all entries in the new format. */
file_entries_new_size = sizeof (struct cache_file_new) file_entries_new_size = sizeof (struct cache_file_new)
@@ -370,7 +370,7 @@ save_cache (const char *cache_name)
table, we have to adjust all string indices for this so that table, we have to adjust all string indices for this so that
old libc5/glibc 2 dynamic linkers just ignore them. */ old libc5/glibc 2 dynamic linkers just ignore them. */
unsigned int str_offset; unsigned int str_offset;
if (opt_format != 0) if (opt_format != opt_format_old)
str_offset = file_entries_new_size; str_offset = file_entries_new_size;
else else
str_offset = 0; str_offset = 0;
@@ -385,13 +385,13 @@ save_cache (const char *cache_name)
entry = entry->next, ++idx_new) entry = entry->next, ++idx_new)
{ {
/* First the library. */ /* First the library. */
if (opt_format != 2 && entry->hwcap == 0) if (opt_format != opt_format_new && entry->hwcap == 0)
{ {
file_entries->libs[idx_old].flags = entry->flags; file_entries->libs[idx_old].flags = entry->flags;
/* XXX: Actually we can optimize here and remove duplicates. */ /* XXX: Actually we can optimize here and remove duplicates. */
file_entries->libs[idx_old].key = str_offset + pad; file_entries->libs[idx_old].key = str_offset + pad;
} }
if (opt_format != 0) if (opt_format != opt_format_old)
{ {
/* We could subtract file_entries_new_size from str_offset - /* We could subtract file_entries_new_size from str_offset -
not doing so makes the code easier, the string table not doing so makes the code easier, the string table
@@ -407,9 +407,9 @@ save_cache (const char *cache_name)
str = mempcpy (str, entry->lib, len); str = mempcpy (str, entry->lib, len);
str_offset += len; str_offset += len;
/* Then the path. */ /* Then the path. */
if (opt_format != 2 && entry->hwcap == 0) if (opt_format != opt_format_new && entry->hwcap == 0)
file_entries->libs[idx_old].value = str_offset + pad; file_entries->libs[idx_old].value = str_offset + pad;
if (opt_format != 0) if (opt_format != opt_format_old)
file_entries_new->libs[idx_new].value = str_offset; file_entries_new->libs[idx_new].value = str_offset;
len = strlen (entry->path) + 1; len = strlen (entry->path) + 1;
str = mempcpy (str, entry->path, len); str = mempcpy (str, entry->path, len);
@@ -420,7 +420,7 @@ save_cache (const char *cache_name)
} }
/* Duplicate last old cache entry if needed. */ /* Duplicate last old cache entry if needed. */
if (opt_format != 2 if (opt_format != opt_format_new
&& idx_old < cache_entry_old_count) && idx_old < cache_entry_old_count)
file_entries->libs[idx_old] = file_entries->libs[idx_old - 1]; file_entries->libs[idx_old] = file_entries->libs[idx_old - 1];
@@ -438,16 +438,16 @@ save_cache (const char *cache_name)
temp_name); temp_name);
/* Write contents. */ /* Write contents. */
if (opt_format != 2) if (opt_format != opt_format_new)
{ {
if (write (fd, file_entries, file_entries_size) if (write (fd, file_entries, file_entries_size)
!= (ssize_t) file_entries_size) != (ssize_t) file_entries_size)
error (EXIT_FAILURE, errno, _("Writing of cache data failed")); error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
} }
if (opt_format != 0) if (opt_format != opt_format_old)
{ {
/* Align cache. */ /* Align cache. */
if (opt_format != 2) if (opt_format != opt_format_new)
{ {
char zero[pad]; char zero[pad];
memset (zero, '\0', pad); memset (zero, '\0', pad);

View File

@@ -100,8 +100,7 @@ static int opt_print_cache;
int opt_verbose; int opt_verbose;
/* Format to support. */ /* Format to support. */
/* 0: only libc5/glibc2; 1: both; 2: only glibc 2.2. */ enum opt_format opt_format = opt_format_new;
int opt_format = 2;
/* Build cache. */ /* Build cache. */
static int opt_build_cache = 1; static int opt_build_cache = 1;
@@ -281,11 +280,11 @@ parse_opt (int key, char *arg, struct argp_state *state)
break; break;
case 'c': case 'c':
if (strcmp (arg, "old") == 0) if (strcmp (arg, "old") == 0)
opt_format = 0; opt_format = opt_format_old;
else if (strcmp (arg, "compat") == 0) else if (strcmp (arg, "compat") == 0)
opt_format = 1; opt_format = opt_format_compat;
else if (strcmp (arg, "new") == 0) else if (strcmp (arg, "new") == 0)
opt_format = 2; opt_format = opt_format_new;
break; break;
default: default:
return ARGP_ERR_UNKNOWN; return ARGP_ERR_UNKNOWN;

View File

@@ -90,7 +90,14 @@ extern char *chroot_canon (const char *chroot, const char *name);
/* Declared in ldconfig.c. */ /* Declared in ldconfig.c. */
extern int opt_verbose; extern int opt_verbose;
extern int opt_format; enum opt_format
{
opt_format_old = 0, /* Use struct cache_file. */
opt_format_compat = 1, /* Use both, old format followed by new. */
opt_format_new = 2, /* Use struct cache_file_new. */
};
extern enum opt_format opt_format;
/* Prototypes for a few program-wide used functions. */ /* Prototypes for a few program-wide used functions. */
#include <programs/xmalloc.h> #include <programs/xmalloc.h>