Add decoding of new constants defined in Oct 4, 1999 draft of ELF ABI spec.
This commit is contained in:
parent
4fbca4530b
commit
d113390691
2 changed files with 196 additions and 40 deletions
|
@ -1,3 +1,23 @@
|
|||
1999-12-28 Nick Clifton <nickc@cygnus.com>
|
||||
|
||||
* readelf.c: Update with new constants added by Oct 4, 1999
|
||||
ELF ABI draft.
|
||||
(guess_is_rela): Add new machine codes, but leave
|
||||
rel type undetermined.
|
||||
(get_machine_name): Add new machine codes.
|
||||
(get_section_type_name): Add new section types.
|
||||
(get_elf_section_flags): New funciton: Decode section flags.
|
||||
(process_section_headers): Call get_elf_section_flags() in
|
||||
order to decode flags in section header.
|
||||
(get_dynamic_flags): New function: Decode dynamic section
|
||||
flags.
|
||||
(process_dynamic_section): Display flags (if present).
|
||||
(get_symbol_type): Add STT_COMMON.
|
||||
(get_symbol_visibility): New function: Decode a symbol's
|
||||
visibility.
|
||||
(process_symbol_table): Call get_symbol_visibility().
|
||||
(get_note_type): Add NT_PRXFPREGS.
|
||||
|
||||
1999-12-26 Ian Lance Taylor <ian@zembu.com>
|
||||
|
||||
* strings.c (main): Correct handling of numeric argument.
|
||||
|
|
|
@ -158,8 +158,11 @@ static const char * get_segment_type PARAMS ((unsigned long));
|
|||
static const char * get_mips_section_type_name PARAMS ((unsigned int));
|
||||
static const char * get_parisc_section_type_name PARAMS ((unsigned int));
|
||||
static const char * get_section_type_name PARAMS ((unsigned int));
|
||||
static char * get_symbol_binding PARAMS ((unsigned int));
|
||||
static char * get_symbol_type PARAMS ((unsigned int));
|
||||
static const char * get_symbol_binding PARAMS ((unsigned int));
|
||||
static const char * get_symbol_type PARAMS ((unsigned int));
|
||||
static const char * get_symbol_visibility PARAMS ((unsigned int));
|
||||
static const char * get_symbol_index_type PARAMS ((unsigned int));
|
||||
static const char * get_dynamic_flags PARAMS ((bfd_vma));
|
||||
static void usage PARAMS ((void));
|
||||
static void parse_args PARAMS ((int, char **));
|
||||
static int process_file_header PARAMS ((void));
|
||||
|
@ -174,7 +177,6 @@ static void process_file PARAMS ((char *));
|
|||
static int process_relocs PARAMS ((FILE *));
|
||||
static int process_version_sections PARAMS ((FILE *));
|
||||
static char * get_ver_flags PARAMS ((unsigned int));
|
||||
static char * get_symbol_index_type PARAMS ((unsigned int));
|
||||
static int get_32bit_section_headers PARAMS ((FILE *));
|
||||
static int get_64bit_section_headers PARAMS ((FILE *));
|
||||
static int get_32bit_program_headers PARAMS ((FILE *, Elf_Internal_Phdr *));
|
||||
|
@ -565,6 +567,24 @@ guess_is_rela (e_machine)
|
|||
case EM_MCORE:
|
||||
return TRUE;
|
||||
|
||||
case EM_MMA:
|
||||
case EM_PCP:
|
||||
case EM_NCPU:
|
||||
case EM_NDR1:
|
||||
case EM_STARCORE:
|
||||
case EM_ME16:
|
||||
case EM_ST100:
|
||||
case EM_TINYJ:
|
||||
case EM_FX66:
|
||||
case EM_ST9PLUS:
|
||||
case EM_ST7:
|
||||
case EM_68HC16:
|
||||
case EM_68HC11:
|
||||
case EM_68HC08:
|
||||
case EM_68HC05:
|
||||
case EM_SVX:
|
||||
case EM_ST19:
|
||||
case EM_VAX:
|
||||
default:
|
||||
warn (_("Don't know about relocations on this machine architecture\n"));
|
||||
return FALSE;
|
||||
|
@ -1037,6 +1057,11 @@ get_dynamic_type (type)
|
|||
case DT_FINI_ARRAY: return "FINI_ARRAY";
|
||||
case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
|
||||
case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
|
||||
case DT_RUNPATH: return "RUNPATH";
|
||||
case DT_FLAGS: return "FLAGS";
|
||||
case DT_ENCODING: return "ENCODING";
|
||||
case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
|
||||
case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
|
||||
|
||||
case DT_PLTPADSZ: return "PLTPADSZ";
|
||||
case DT_MOVEENT: return "MOVEENT";
|
||||
|
@ -1142,7 +1167,7 @@ static char *
|
|||
get_machine_name (e_machine)
|
||||
unsigned e_machine;
|
||||
{
|
||||
static char buff [32];
|
||||
static char buff [64]; /* XXX */
|
||||
|
||||
switch (e_machine)
|
||||
{
|
||||
|
@ -1154,7 +1179,7 @@ get_machine_name (e_machine)
|
|||
case EM_88K: return "MC88000";
|
||||
case EM_486: return "Intel 80486";
|
||||
case EM_860: return "Intel 80860";
|
||||
case EM_MIPS: return "MIPS R3000 big-endian";
|
||||
case EM_MIPS: return "MIPS R3000";
|
||||
case EM_S370: return "Amdahl";
|
||||
case EM_MIPS_RS4_BE: return "MIPS R4000 big-endian";
|
||||
case EM_OLD_SPARCV9: return "Sparc v9 (old)";
|
||||
|
@ -1191,6 +1216,24 @@ get_machine_name (e_machine)
|
|||
case EM_CYGNUS_MN10200: return "mn10200";
|
||||
case EM_CYGNUS_FR30: return "Fujitsu FR30";
|
||||
case EM_PJ: return "picoJava";
|
||||
case EM_MMA: return "Fujitsu Multimedia Accelerator";
|
||||
case EM_PCP: return "Siemens PCP";
|
||||
case EM_NCPU: return "Sony nCPU embedded RISC processor";
|
||||
case EM_NDR1: return "Denso NDR1 microprocesspr";
|
||||
case EM_STARCORE: return "Motorola Star*Core processor";
|
||||
case EM_ME16: return "Toyota ME16 processor";
|
||||
case EM_ST100: return "STMicroelectronics ST100 processor";
|
||||
case EM_TINYJ: return "Advanced Logic Corp. TinyJ embedded processor";
|
||||
case EM_FX66: return "Siemens FX66 microcontroller";
|
||||
case EM_ST9PLUS: return "STMicroelectronics ST9+ 8/16 bit microcontroller";
|
||||
case EM_ST7: return "STMicroelectronics ST7 8-bit microcontroller";
|
||||
case EM_68HC16: return "Motorola MC68HC16 Microcontroller";
|
||||
case EM_68HC11: return "Motorola MC68HC11 Microcontroller";
|
||||
case EM_68HC08: return "Motorola MC68HC08 Microcontroller";
|
||||
case EM_68HC05: return "Motorola MC68HC05 Microcontroller";
|
||||
case EM_SVX: return "Silicon Graphics SVx";
|
||||
case EM_ST19: return "STMicroelectronics ST19 8-bit microcontroller";
|
||||
case EM_VAX: return "Digital VAX";
|
||||
default:
|
||||
sprintf (buff, _("<unknown>: %x"), e_machine);
|
||||
return buff;
|
||||
|
@ -1205,6 +1248,7 @@ get_machine_flags (e_flags, e_machine)
|
|||
static char buf [1024];
|
||||
|
||||
buf[0] = '\0';
|
||||
|
||||
if (e_flags)
|
||||
{
|
||||
switch (e_machine)
|
||||
|
@ -1545,6 +1589,9 @@ get_section_type_name (sh_type)
|
|||
case SHT_REL: return "REL";
|
||||
case SHT_SHLIB: return "SHLIB";
|
||||
case SHT_DYNSYM: return "DYNSYM";
|
||||
case SHT_INIT_ARRAY: return "INIT_ARRAY";
|
||||
case SHT_FINI_ARRAY: return "FINI_ARRAY";
|
||||
case SHT_PREINIT_ARRAY: return "PREINIT_ARRAY";
|
||||
case SHT_GNU_verdef: return "VERDEF";
|
||||
case SHT_GNU_verneed: return "VERNEED";
|
||||
case SHT_GNU_versym: return "VERSYM";
|
||||
|
@ -2389,6 +2436,52 @@ get_64bit_elf_symbols (file, offset, number)
|
|||
return isyms;
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_elf_section_flags (sh_flags)
|
||||
bfd_vma sh_flags;
|
||||
{
|
||||
static char buff [32];
|
||||
|
||||
* buff = 0;
|
||||
|
||||
while (sh_flags)
|
||||
{
|
||||
bfd_vma flag;
|
||||
|
||||
flag = sh_flags & - sh_flags;
|
||||
sh_flags &= ~ flag;
|
||||
|
||||
switch (flag)
|
||||
{
|
||||
case SHF_WRITE: strcat (buff, "W"); break;
|
||||
case SHF_ALLOC: strcat (buff, "A"); break;
|
||||
case SHF_EXECINSTR: strcat (buff, "X"); break;
|
||||
case SHF_MERGE: strcat (buff, "M"); break;
|
||||
case SHF_STRINGS: strcat (buff, "S"); break;
|
||||
case SHF_INFO_LINK: strcat (buff, "I"); break;
|
||||
case SHF_LINK_ORDER: strcat (buff, "L"); break;
|
||||
case SHF_OS_NONCONFORMING: strcat (buff, "O"); break;
|
||||
|
||||
default:
|
||||
if (flag & SHF_MASKOS)
|
||||
{
|
||||
strcat (buff, "o");
|
||||
sh_flags &= ~ SHF_MASKOS;
|
||||
}
|
||||
else if (flag & SHF_MASKPROC)
|
||||
{
|
||||
strcat (buff, "p");
|
||||
sh_flags &= ~ SHF_MASKPROC;
|
||||
}
|
||||
else
|
||||
strcat (buff, "x");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
||||
static int
|
||||
process_section_headers (file)
|
||||
FILE * file;
|
||||
|
@ -2488,6 +2581,7 @@ process_section_headers (file)
|
|||
return 1;
|
||||
|
||||
printf (_("\nSection Header%s:\n"), elf_header.e_shnum > 1 ? "s" : "");
|
||||
|
||||
if (is_32bit_elf)
|
||||
printf
|
||||
(_(" [Nr] Name Type Addr Off Size ES Flg Lk Inf Al\n"));
|
||||
|
@ -2514,11 +2608,10 @@ process_section_headers (file)
|
|||
(unsigned long) section->sh_offset,
|
||||
(unsigned long) section->sh_size,
|
||||
(unsigned long) section->sh_entsize);
|
||||
|
||||
printf (" %c%c%c %2ld %3lx %ld\n",
|
||||
(section->sh_flags & SHF_WRITE ? 'W' : ' '),
|
||||
(section->sh_flags & SHF_ALLOC ? 'A' : ' '),
|
||||
(section->sh_flags & SHF_EXECINSTR ? 'X' : ' '),
|
||||
|
||||
printf (" %3s ", get_elf_section_flags (section->sh_flags));
|
||||
|
||||
printf (" %2ld %3lx %ld\n",
|
||||
(unsigned long) section->sh_link,
|
||||
(unsigned long) section->sh_info,
|
||||
(unsigned long) section->sh_addralign);
|
||||
|
@ -2533,11 +2626,8 @@ process_section_headers (file)
|
|||
printf (" ");
|
||||
print_vma (section->sh_entsize, LONG_HEX);
|
||||
|
||||
printf (" %c%c%c",
|
||||
(section->sh_flags & SHF_WRITE ? 'W' : ' '),
|
||||
(section->sh_flags & SHF_ALLOC ? 'A' : ' '),
|
||||
(section->sh_flags & SHF_EXECINSTR ? 'X' : ' '));
|
||||
|
||||
printf (" %3s ", get_elf_section_flags (section->sh_flags));
|
||||
|
||||
printf (" %2ld %3lx %ld\n",
|
||||
(unsigned long) section->sh_link,
|
||||
(unsigned long) section->sh_info,
|
||||
|
@ -2545,6 +2635,10 @@ process_section_headers (file)
|
|||
}
|
||||
}
|
||||
|
||||
printf (_("Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings)\n"));
|
||||
printf (_(" I (info), L (link order), O (extra OS processing required)\n"));
|
||||
printf (_(" o (os specific), p (processor specific) x (unknown)\n"));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2886,6 +2980,29 @@ get_64bit_dynamic_segment (file)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_dynamic_flags (flags)
|
||||
bfd_vma flags;
|
||||
{
|
||||
static char buff [64];
|
||||
while (flags)
|
||||
{
|
||||
bfd_vma flag;
|
||||
|
||||
flag = flags & - flags;
|
||||
flags &= ~ flag;
|
||||
|
||||
switch (flag)
|
||||
{
|
||||
case DF_ORIGIN: strcat (buff, "ORIGIN "); break;
|
||||
case DF_SYMBOLIC: strcat (buff, "SYMBOLIC "); break;
|
||||
case DF_TEXTREL: strcat (buff, "TEXTREL "); break;
|
||||
case DF_BIND_NOW: strcat (buff, "BIND_NOW "); break;
|
||||
default: strcat (buff, "unknown "); return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse and display the contents of the dynamic segment. */
|
||||
static int
|
||||
process_dynamic_segment (file)
|
||||
|
@ -3058,6 +3175,11 @@ process_dynamic_segment (file)
|
|||
|
||||
switch (entry->d_tag)
|
||||
{
|
||||
case DT_FLAGS:
|
||||
if (do_dynamic)
|
||||
printf (get_dynamic_flags (entry->d_un.d_val));
|
||||
break;
|
||||
|
||||
case DT_AUXILIARY:
|
||||
case DT_FILTER:
|
||||
if (do_dynamic)
|
||||
|
@ -3854,7 +3976,7 @@ process_version_sections (file)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static char *
|
||||
static const char *
|
||||
get_symbol_binding (binding)
|
||||
unsigned int binding;
|
||||
{
|
||||
|
@ -3876,7 +3998,7 @@ get_symbol_binding (binding)
|
|||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
static const char *
|
||||
get_symbol_type (type)
|
||||
unsigned int type;
|
||||
{
|
||||
|
@ -3889,6 +4011,7 @@ get_symbol_type (type)
|
|||
case STT_FUNC: return "FUNC";
|
||||
case STT_SECTION: return "SECTION";
|
||||
case STT_FILE: return "FILE";
|
||||
case STT_COMMON: return "COMMON";
|
||||
default:
|
||||
if (type >= STT_LOPROC && type <= STT_HIPROC)
|
||||
{
|
||||
|
@ -3921,7 +4044,21 @@ get_symbol_type (type)
|
|||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
static const char *
|
||||
get_symbol_visibility (visibility)
|
||||
unsigned int visibility;
|
||||
{
|
||||
switch (visibility)
|
||||
{
|
||||
case STV_DEFAULT: return "DEFAULT";
|
||||
case STV_INTERNAL: return "INTERNAL";
|
||||
case STV_HIDDEN: return "HIDDEN";
|
||||
case STV_PROTECTED: return "PROTECTED";
|
||||
default: abort ();
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_symbol_index_type (type)
|
||||
unsigned int type;
|
||||
{
|
||||
|
@ -3947,7 +4084,6 @@ get_symbol_index_type (type)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
static int *
|
||||
get_dynamic_data (file, number)
|
||||
FILE * file;
|
||||
|
@ -4042,9 +4178,9 @@ process_symbol_table (file)
|
|||
|
||||
printf (_("\nSymbol table for image:\n"));
|
||||
if (is_32bit_elf)
|
||||
printf (_(" Num Buc: Value Size Type Bind Ot Ndx Name\n"));
|
||||
printf (_(" Num Buc: Value Size Type Bind Vis Ot Ndx Name\n"));
|
||||
else
|
||||
printf (_(" Num Buc: Value Size Type Bind Ot Ndx Name\n"));
|
||||
printf (_(" Num Buc: Value Size Type Bind Vis Ot Ndx Name\n"));
|
||||
|
||||
for (hn = 0; hn < nbuckets; hn++)
|
||||
{
|
||||
|
@ -4060,15 +4196,13 @@ process_symbol_table (file)
|
|||
printf (" %3d %3d: ", si, hn);
|
||||
print_vma (psym->st_value, LONG_HEX);
|
||||
putchar (' ' );
|
||||
print_vma (psym->st_size, DEC_5);
|
||||
print_vma (psym->st_size, DEC_5);
|
||||
|
||||
printf (" %6s %6s %2d ",
|
||||
get_symbol_type (ELF_ST_TYPE (psym->st_info)),
|
||||
get_symbol_binding (ELF_ST_BIND (psym->st_info)),
|
||||
psym->st_other);
|
||||
|
||||
printf ("%3.3s", get_symbol_index_type (psym->st_shndx));
|
||||
|
||||
printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
|
||||
printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
|
||||
printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
|
||||
printf (" %2d", ELF_ST_OTHER (psym->st_other));
|
||||
printf (" %3.3s", get_symbol_index_type (psym->st_shndx));
|
||||
printf (" %s\n", dynamic_strings + psym->st_name);
|
||||
}
|
||||
}
|
||||
|
@ -4095,9 +4229,9 @@ process_symbol_table (file)
|
|||
SECTION_NAME (section),
|
||||
(unsigned long) (section->sh_size / section->sh_entsize));
|
||||
if (is_32bit_elf)
|
||||
printf (_(" Num: Value Size Type Bind Ot Ndx Name\n"));
|
||||
printf (_(" Num: Value Size Type Bind Vis Ot Ndx Name\n"));
|
||||
else
|
||||
printf (_(" Num: Value Size Type Bind Ot Ndx Name\n"));
|
||||
printf (_(" Num: Value Size Type Bind Vis Ot Ndx Name\n"));
|
||||
|
||||
symtab = GET_ELF_SYMBOLS (file, section->sh_offset,
|
||||
section->sh_size / section->sh_entsize);
|
||||
|
@ -4124,13 +4258,11 @@ process_symbol_table (file)
|
|||
print_vma (psym->st_value, LONG_HEX);
|
||||
putchar (' ');
|
||||
print_vma (psym->st_size, DEC_5);
|
||||
printf (" %-7s %-6s %2d ",
|
||||
get_symbol_type (ELF_ST_TYPE (psym->st_info)),
|
||||
get_symbol_binding (ELF_ST_BIND (psym->st_info)),
|
||||
psym->st_other);
|
||||
|
||||
printf ("%4s", get_symbol_index_type (psym->st_shndx));
|
||||
|
||||
printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
|
||||
printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
|
||||
printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
|
||||
printf (" %2d", ELF_ST_OTHER (psym->st_other));
|
||||
printf (" %4s", get_symbol_index_type (psym->st_shndx));
|
||||
printf (" %s", strtab + psym->st_name);
|
||||
|
||||
if (section->sh_type == SHT_DYNSYM &&
|
||||
|
@ -6541,7 +6673,7 @@ process_mips_specific (file)
|
|||
if (options_offset != 0)
|
||||
{
|
||||
Elf_External_Options * eopt;
|
||||
Elf_Internal_Shdr * sect = section_headers;
|
||||
Elf_Internal_Shdr * sect = section_headers;
|
||||
Elf_Internal_Options * iopt;
|
||||
Elf_Internal_Options * option;
|
||||
size_t offset;
|
||||
|
@ -6549,7 +6681,7 @@ process_mips_specific (file)
|
|||
|
||||
/* Find the section header so that we get the size. */
|
||||
while (sect->sh_type != SHT_MIPS_OPTIONS)
|
||||
++sect;
|
||||
++ sect;
|
||||
|
||||
GET_DATA_ALLOC (options_offset, sect->sh_size, eopt,
|
||||
Elf_External_Options *, "options");
|
||||
|
@ -6564,6 +6696,7 @@ process_mips_specific (file)
|
|||
|
||||
offset = cnt = 0;
|
||||
option = iopt;
|
||||
|
||||
while (offset < sect->sh_size)
|
||||
{
|
||||
Elf_External_Options * eoption;
|
||||
|
@ -6576,6 +6709,7 @@ process_mips_specific (file)
|
|||
option->info = BYTE_GET (eoption->info);
|
||||
|
||||
offset += option->size;
|
||||
|
||||
++option;
|
||||
++cnt;
|
||||
}
|
||||
|
@ -6584,6 +6718,7 @@ process_mips_specific (file)
|
|||
string_table + sect->sh_name, cnt);
|
||||
|
||||
option = iopt;
|
||||
|
||||
while (cnt-- > 0)
|
||||
{
|
||||
size_t len;
|
||||
|
@ -6799,6 +6934,7 @@ get_note_type (e_type)
|
|||
case NT_FPREGSET: return _("NT_FPREGSET (floating point registers)");
|
||||
case NT_PRPSINFO: return _("NT_PRPSINFO (prpsinfo structure)");
|
||||
case NT_TASKSTRUCT: return _("NT_TASKSTRUCT (task structure)");
|
||||
case NT_PRXFPREG: return _("NT_PRXFPREG (user_xfpregs structure)");
|
||||
case NT_PSTATUS: return _("NT_PSTATUS (pstatus structure)");
|
||||
case NT_FPREGS: return _("NT_FPREGS (floating point registers)");
|
||||
case NT_PSINFO: return _("NT_PSINFO (psinfo structure)");
|
||||
|
|
Loading…
Reference in a new issue