* readelf.c (get_dynamic_type): Handle DT_GNU_PRELINKED,
DT_GNU_CONFLICT* and DT_GNU_LIBLISZ*. (get_section_type_name): Handle SHT_GNU_LIBLIST. (process_dynamic_segment): Handle DT_GNU_CONFLICTSZ, DT_GNU_LIBLISTSZ and DT_GNU_PRELINKED. (process_gnu_liblist): New. (process_file): Call it. * elf/common.h (SHT_GNU_LIBLIST, DT_GNU_PRELINKED, DT_GNU_CONFLICT*, DT_GNU_LIBLIST*): Define.
This commit is contained in:
parent
f5e87a1da3
commit
047b22647d
4 changed files with 129 additions and 1 deletions
|
@ -264,6 +264,7 @@ static int process_corefile_note_segment PARAMS ((FILE *, bfd_vma, bfd_vma))
|
|||
static int process_corefile_note_segments PARAMS ((FILE *));
|
||||
static int process_corefile_contents PARAMS ((FILE *));
|
||||
static int process_arch_specific PARAMS ((FILE *));
|
||||
static int process_gnu_liblist PARAMS ((FILE *));
|
||||
|
||||
typedef int Elf32_Word;
|
||||
|
||||
|
@ -525,7 +526,7 @@ print_vma (vma, mode)
|
|||
|
||||
/* Display a symbol on stdout. If do_wide is not true then
|
||||
format the symbol to be at most WIDTH characters,
|
||||
truhncating as necessary. If WIDTH is negative then
|
||||
truncating as necessary. If WIDTH is negative then
|
||||
format the string to be exactly - WIDTH characters,
|
||||
truncating or padding as necessary. */
|
||||
|
||||
|
@ -1388,6 +1389,12 @@ get_dynamic_type (type)
|
|||
case DT_USED: return "USED";
|
||||
case DT_FILTER: return "FILTER";
|
||||
|
||||
case DT_GNU_PRELINKED: return "GNU_PRELINKED";
|
||||
case DT_GNU_CONFLICT: return "GNU_CONFLICT";
|
||||
case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
|
||||
case DT_GNU_LIBLIST: return "GNU_LIBLIST";
|
||||
case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
|
||||
|
||||
default:
|
||||
if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
|
||||
{
|
||||
|
@ -2194,6 +2201,7 @@ get_section_type_name (sh_type)
|
|||
case 0x6ffffffc: return "VERDEF";
|
||||
case 0x7ffffffd: return "AUXILIARY";
|
||||
case 0x7fffffff: return "FILTER";
|
||||
case SHT_GNU_LIBLIST: return "GNU_LIBLIST";
|
||||
|
||||
default:
|
||||
if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
|
||||
|
@ -4755,6 +4763,8 @@ process_dynamic_segment (file)
|
|||
case DT_MOVESZ :
|
||||
case DT_INIT_ARRAYSZ:
|
||||
case DT_FINI_ARRAYSZ:
|
||||
case DT_GNU_CONFLICTSZ:
|
||||
case DT_GNU_LIBLISTSZ:
|
||||
if (do_dynamic)
|
||||
{
|
||||
print_vma (entry->d_un.d_val, UNSIGNED);
|
||||
|
@ -4803,6 +4813,20 @@ process_dynamic_segment (file)
|
|||
/* The value of this entry is ignored. */
|
||||
break;
|
||||
|
||||
case DT_GNU_PRELINKED:
|
||||
if (do_dynamic)
|
||||
{
|
||||
struct tm * tmp;
|
||||
time_t time = entry->d_un.d_val;
|
||||
|
||||
tmp = gmtime (&time);
|
||||
printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
|
||||
tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
|
||||
tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
|
||||
version_info [DT_VERSIONTAGIDX (entry->d_tag)] =
|
||||
|
@ -9369,6 +9393,86 @@ process_mips_specific (file)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
process_gnu_liblist (file)
|
||||
FILE * file;
|
||||
{
|
||||
Elf_Internal_Shdr * section, * string_sec;
|
||||
Elf32_External_Lib * elib;
|
||||
char * strtab;
|
||||
size_t cnt;
|
||||
unsigned i;
|
||||
|
||||
if (! do_arch)
|
||||
return 0;
|
||||
|
||||
for (i = 0, section = section_headers;
|
||||
i < elf_header.e_shnum;
|
||||
i++, section ++)
|
||||
{
|
||||
switch (section->sh_type)
|
||||
{
|
||||
case SHT_GNU_LIBLIST:
|
||||
elib = ((Elf32_External_Lib *)
|
||||
get_data (NULL, file, section->sh_offset, section->sh_size,
|
||||
_("liblist")));
|
||||
|
||||
if (elib == NULL)
|
||||
break;
|
||||
string_sec = SECTION_HEADER (section->sh_link);
|
||||
|
||||
strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
|
||||
string_sec->sh_size,
|
||||
_("liblist string table"));
|
||||
|
||||
if (strtab == NULL
|
||||
|| section->sh_entsize != sizeof (Elf32_External_Lib))
|
||||
{
|
||||
free (elib);
|
||||
break;
|
||||
}
|
||||
|
||||
printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
|
||||
SECTION_NAME (section),
|
||||
(long) (section->sh_size / sizeof (Elf32_External_Lib)));
|
||||
|
||||
puts (" Library Time Stamp Checksum Version Flags");
|
||||
|
||||
for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
|
||||
++cnt)
|
||||
{
|
||||
Elf32_Lib liblist;
|
||||
time_t time;
|
||||
char timebuf[20];
|
||||
struct tm * tmp;
|
||||
|
||||
liblist.l_name = BYTE_GET (elib[cnt].l_name);
|
||||
time = BYTE_GET (elib[cnt].l_time_stamp);
|
||||
liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
|
||||
liblist.l_version = BYTE_GET (elib[cnt].l_version);
|
||||
liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
|
||||
|
||||
tmp = gmtime (&time);
|
||||
sprintf (timebuf, "%04u-%02u-%02uT%02u:%02u:%02u",
|
||||
tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
|
||||
tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
|
||||
|
||||
printf ("%3lu: ", (unsigned long) cnt);
|
||||
if (do_wide)
|
||||
printf ("%-20s", strtab + liblist.l_name);
|
||||
else
|
||||
printf ("%-20.20s", strtab + liblist.l_name);
|
||||
printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
|
||||
liblist.l_version, liblist.l_flags);
|
||||
}
|
||||
|
||||
free (elib);
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_note_type (e_type)
|
||||
unsigned e_type;
|
||||
|
@ -9816,6 +9920,8 @@ process_file (file_name)
|
|||
|
||||
process_corefile_contents (file);
|
||||
|
||||
process_gnu_liblist (file);
|
||||
|
||||
process_arch_specific (file);
|
||||
|
||||
fclose (file);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue