(dump_relocations): EM_ARM uses rela relocs.

This commit is contained in:
Catherine Moore 1998-07-31 15:08:44 +00:00
parent 860fe0c07e
commit be5b92f932
2 changed files with 167 additions and 57 deletions

View File

@ -1,3 +1,15 @@
Fri Jul 31 10:04:23 1998 Catherine Moore <clm@cygnus.com>
* readelf.c (dump_relocations): EM_ARM uses rela relocs.
1998-07-30 16:25 Ulrich Drepper <drepper@cygnus.com>
* readelf.c (get_dynamic_type): Don't used gettext on the names.
Add new DT_* values from Solaris. Don't print nuemric value in
case of an unknown entry.
(process_dynamic_segment): Handle new DT_* entries. Print numeric
values in decimal, not hex.
Fri Jul 24 16:28:57 1998 Jeff Holcomb <jeffh@cygnus.com> Fri Jul 24 16:28:57 1998 Jeff Holcomb <jeffh@cygnus.com>
* readelf.c (get_dynamic_type): Remove empty default from switch * readelf.c (get_dynamic_type): Remove empty default from switch

View File

@ -74,8 +74,8 @@ char * dynamic_strings;
char * string_table; char * string_table;
Elf_Internal_Sym * dynamic_symbols; Elf_Internal_Sym * dynamic_symbols;
char program_interpreter [64]; char program_interpreter [64];
int dynamic_info [DT_JMPREL + 1]; int dynamic_info[DT_JMPREL + 1];
int version_info [16]; int version_info[16];
int loadaddr = 0; int loadaddr = 0;
Elf_Internal_Ehdr elf_header; Elf_Internal_Ehdr elf_header;
Elf_Internal_Shdr * section_headers; Elf_Internal_Shdr * section_headers;
@ -313,7 +313,6 @@ dump_relocations (file, rel_offset, rel_size, symtab, strtab)
case EM_CYGNUS_D10V: case EM_CYGNUS_D10V:
case EM_MIPS: case EM_MIPS:
case EM_MIPS_RS4_BE: case EM_MIPS_RS4_BE:
case EM_ARM:
{ {
Elf32_External_Rel * erels; Elf32_External_Rel * erels;
@ -338,6 +337,7 @@ dump_relocations (file, rel_offset, rel_size, symtab, strtab)
} }
break; break;
case EM_ARM:
case EM_68K: case EM_68K:
case EM_SPARC: case EM_SPARC:
case EM_PPC: case EM_PPC:
@ -574,37 +574,45 @@ get_dynamic_type (type)
switch (type) switch (type)
{ {
case DT_NULL: return _("NULL"); case DT_NULL: return "NULL";
case DT_NEEDED: return _("NEEDED"); case DT_NEEDED: return "NEEDED";
case DT_PLTRELSZ: return _("PLTRELSZ"); case DT_PLTRELSZ: return "PLTRELSZ";
case DT_PLTGOT: return _("PLTGOT"); case DT_PLTGOT: return "PLTGOT";
case DT_HASH: return _("HASH"); case DT_HASH: return "HASH";
case DT_STRTAB: return _("STRTAB"); case DT_STRTAB: return "STRTAB";
case DT_SYMTAB: return _("SYMTAB"); case DT_SYMTAB: return "SYMTAB";
case DT_RELA: return _("RELA"); case DT_RELA: return "RELA";
case DT_RELASZ: return _("RELASZ"); case DT_RELASZ: return "RELASZ";
case DT_RELAENT: return _("RELAENT"); case DT_RELAENT: return "RELAENT";
case DT_STRSZ: return _("STRSZ"); case DT_STRSZ: return "STRSZ";
case DT_SYMENT: return _("SYMENT"); case DT_SYMENT: return "SYMENT";
case DT_INIT: return _("INIT"); case DT_INIT: return "INIT";
case DT_FINI: return _("FINI"); case DT_FINI: return "FINI";
case DT_SONAME: return _("SONAME"); case DT_SONAME: return "SONAME";
case DT_RPATH: return _("RPATH"); case DT_RPATH: return "RPATH";
case DT_SYMBOLIC: return _("SYMBOLIC"); case DT_SYMBOLIC: return "SYMBOLIC";
case DT_REL: return _("REL"); case DT_REL: return "REL";
case DT_RELSZ: return _("RELSZ"); case DT_RELSZ: return "RELSZ";
case DT_RELENT: return _("RELENT"); case DT_RELENT: return "RELENT";
case DT_PLTREL: return _("PLTREL"); case DT_PLTREL: return "PLTREL";
case DT_DEBUG: return _("DEBUG"); case DT_DEBUG: return "DEBUG";
case DT_TEXTREL: return _("TEXTREL"); case DT_TEXTREL: return "TEXTREL";
case DT_JMPREL: return _("JMPREL"); case DT_JMPREL: return "JMPREL";
case DT_VERDEF: return _("VERDEF"); case DT_VERDEF: return "VERDEF";
case DT_VERDEFNUM: return _("VERDEFNUM"); case DT_VERDEFNUM: return "VERDEFNUM";
case DT_VERNEED: return _("VERNEED"); case DT_VERNEED: return "VERNEED";
case DT_VERNEEDNUM: return _("VERNEEDNUM"); case DT_VERNEEDNUM: return "VERNEEDNUM";
case DT_VERSYM: return _("VERSYN"); case DT_VERSYM: return "VERSYN";
case DT_AUXILIARY: return _("AUXILARY"); case DT_AUXILIARY: return "AUXILARY";
case DT_FILTER: return _("FILTER"); case DT_FILTER: return "FILTER";
case DT_POSFLAG_1: return "POSFLAG_1";
case DT_SYMINSZ: return "SYMINSZ";
case DT_SYMINENT: return "SYMINENT";
case DT_SYMINFO: return "SYMINFO";
case DT_RELACOUNT: return "RELACOUNT";
case DT_RELCOUNT: return "RELCOUNT";
case DT_FLAGS_1: return "FLAGS_1";
case DT_USED: return "USED";
default: default:
if ((type >= DT_LOPROC) && (type <= DT_HIPROC)) if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
@ -619,7 +627,7 @@ get_dynamic_type (type)
if (result == NULL) if (result == NULL)
{ {
sprintf (buff, _("Processor Specific: (%x)"), type); sprintf (buff, _("Processor Specific"), type);
result = buff; result = buff;
} }
return result; return result;
@ -1593,20 +1601,20 @@ process_relocs (file)
rel_size = 0; rel_size = 0;
rel_offset = 0; rel_offset = 0;
if (dynamic_info [DT_REL]) if (dynamic_info[DT_REL])
{ {
rel_offset = dynamic_info [DT_REL]; rel_offset = dynamic_info[DT_REL];
rel_size = dynamic_info [DT_RELSZ]; rel_size = dynamic_info[DT_RELSZ];
} }
else if (dynamic_info [DT_RELA]) else if (dynamic_info [DT_RELA])
{ {
rel_offset = dynamic_info [DT_RELA]; rel_offset = dynamic_info[DT_RELA];
rel_size = dynamic_info [DT_RELASZ]; rel_size = dynamic_info[DT_RELASZ];
} }
else if (dynamic_info [DT_JMPREL]) else if (dynamic_info[DT_JMPREL])
{ {
rel_offset = dynamic_info [DT_JMPREL]; rel_offset = dynamic_info[DT_JMPREL];
rel_size = dynamic_info [DT_PLTRELSZ]; rel_size = dynamic_info[DT_PLTRELSZ];
} }
if (rel_size) if (rel_size)
@ -1771,7 +1779,7 @@ process_dynamic_segment (file)
if (entry->d_tag != DT_SYMTAB) if (entry->d_tag != DT_SYMTAB)
continue; continue;
dynamic_info [DT_SYMTAB] = entry->d_un.d_val; dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
/* Since we do not know how big the symbol table is, /* Since we do not know how big the symbol table is,
we default to reading in the entire file (!) and we default to reading in the entire file (!) and
@ -1808,7 +1816,7 @@ process_dynamic_segment (file)
if (entry->d_tag != DT_STRTAB) if (entry->d_tag != DT_STRTAB)
continue; continue;
dynamic_info [DT_STRTAB] = entry->d_un.d_val; dynamic_info[DT_STRTAB] = entry->d_un.d_val;
/* Since we do not know how big the string table is, /* Since we do not know how big the string table is,
we default to reading in the entire file (!) and we default to reading in the entire file (!) and
@ -1869,6 +1877,58 @@ process_dynamic_segment (file)
} }
break; break;
case DT_POSFLAG_1:
if (do_dynamic)
{
printf (_("Flags:"));
if (entry->d_un.d_val == 0)
printf (_(" None\n"));
else
{
if (entry->d_un.d_val & DF_P1_LAZYLOAD)
printf (" LAZYLOAD");
if (entry->d_un.d_val & DF_P1_LAZYLOAD)
printf (" GROUPPERM");
puts ("");
}
}
break;
case DT_FLAGS_1:
if (do_dynamic)
{
printf (_("Flags:"));
if (entry->d_un.d_val == 0)
printf (_(" None\n"));
else
{
if (entry->d_un.d_val & DF_1_NOW)
printf (" NOW");
if (entry->d_un.d_val & DF_1_GLOBAL)
printf (" GLOBAL");
if (entry->d_un.d_val & DF_1_GROUP)
printf (" GROUP");
if (entry->d_un.d_val & DF_1_NODELETE)
printf (" NODELETE");
if (entry->d_un.d_val & DF_1_LOADFLTR)
printf (" LOADFLTR");
if (entry->d_un.d_val & DF_1_INITFIRST)
printf (" INITFIRST");
if (entry->d_un.d_val & DF_1_NOOPEN)
printf (" NOOPEN");
if (entry->d_un.d_val & DF_1_ORIGIN)
printf (" ORIGIN");
if (entry->d_un.d_val & DF_1_DIRECT)
printf (" DIRECT");
if (entry->d_un.d_val & DF_1_TRANS)
printf (" TRANS");
if (entry->d_un.d_val & DF_1_INTERPOSE)
printf (" INTERPOSE");
puts ("");
}
}
break;
case DT_NULL : case DT_NULL :
case DT_NEEDED : case DT_NEEDED :
case DT_PLTRELSZ: case DT_PLTRELSZ:
@ -1877,23 +1937,17 @@ process_dynamic_segment (file)
case DT_STRTAB : case DT_STRTAB :
case DT_SYMTAB : case DT_SYMTAB :
case DT_RELA : case DT_RELA :
case DT_RELASZ :
case DT_RELAENT :
case DT_STRSZ :
case DT_SYMENT :
case DT_INIT : case DT_INIT :
case DT_FINI : case DT_FINI :
case DT_SONAME : case DT_SONAME :
case DT_RPATH : case DT_RPATH :
case DT_SYMBOLIC: case DT_SYMBOLIC:
case DT_REL : case DT_REL :
case DT_RELSZ :
case DT_RELENT :
case DT_PLTREL : case DT_PLTREL :
case DT_DEBUG : case DT_DEBUG :
case DT_TEXTREL : case DT_TEXTREL :
case DT_JMPREL : case DT_JMPREL :
dynamic_info [entry->d_tag] = entry->d_un.d_val; dynamic_info[entry->d_tag] = entry->d_un.d_val;
if (do_dynamic) if (do_dynamic)
{ {
@ -1934,6 +1988,51 @@ process_dynamic_segment (file)
} }
break; break;
case DT_RELASZ :
case DT_RELAENT :
case DT_STRSZ :
case DT_SYMENT :
case DT_RELSZ :
case DT_RELENT :
case DT_VERDEFNUM:
case DT_VERNEEDNUM:
case DT_RELACOUNT:
case DT_RELCOUNT:
printf ("%ld\n", entry->d_un.d_val);
break;
case DT_SYMINSZ :
case DT_SYMINENT:
case DT_SYMINFO :
case DT_USED:
if (do_dynamic)
{
char * name;
if (dynamic_strings == NULL)
name = NULL;
else
name = dynamic_strings + entry->d_un.d_val;
if (name)
{
switch (entry->d_tag)
{
case DT_USED:
printf (_("Not needed object: [%s]\n"), name);
break;
default:
printf ("%#lx\n", (long) entry->d_un.d_val);
}
}
else
printf ("%#lx\n", (long) entry->d_un.d_val);
}
break;
default: default:
if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM)) if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
{ {
@ -2578,7 +2677,7 @@ process_symbol_table (file)
if (! do_syms) if (! do_syms)
return 1; return 1;
if (dynamic_info [DT_HASH] && do_using_dynamic && dynamic_strings != NULL) if (dynamic_info[DT_HASH] && do_using_dynamic && dynamic_strings != NULL)
{ {
char nb [4]; char nb [4];
char nc [4]; char nc [4];
@ -2589,7 +2688,7 @@ process_symbol_table (file)
int hn; int hn;
int si; int si;
if (fseek (file, dynamic_info [DT_HASH] - loadaddr, SEEK_SET)) if (fseek (file, dynamic_info[DT_HASH] - loadaddr, SEEK_SET))
{ {
error (_("Unable to seek to start of dynamic information")); error (_("Unable to seek to start of dynamic information"));
return 0; return 0;
@ -3314,11 +3413,10 @@ process_file (file_name)
/* Initialise per file variables. */ /* Initialise per file variables. */
for (i = NUM_ELEM (version_info); i--;) for (i = NUM_ELEM (version_info); i--;)
version_info [i] = 0; version_info[i] = 0;
for (i = NUM_ELEM (dynamic_info); i--;) for (i = NUM_ELEM (dynamic_info); i--;)
dynamic_info [i] = 0; dynamic_info[i] = 0;
/* Process the file. */ /* Process the file. */
if (show_name) if (show_name)