(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>
* readelf.c (get_dynamic_type): Remove empty default from switch

View File

@ -74,8 +74,8 @@ char * dynamic_strings;
char * string_table;
Elf_Internal_Sym * dynamic_symbols;
char program_interpreter [64];
int dynamic_info [DT_JMPREL + 1];
int version_info [16];
int dynamic_info[DT_JMPREL + 1];
int version_info[16];
int loadaddr = 0;
Elf_Internal_Ehdr elf_header;
Elf_Internal_Shdr * section_headers;
@ -313,7 +313,6 @@ dump_relocations (file, rel_offset, rel_size, symtab, strtab)
case EM_CYGNUS_D10V:
case EM_MIPS:
case EM_MIPS_RS4_BE:
case EM_ARM:
{
Elf32_External_Rel * erels;
@ -338,6 +337,7 @@ dump_relocations (file, rel_offset, rel_size, symtab, strtab)
}
break;
case EM_ARM:
case EM_68K:
case EM_SPARC:
case EM_PPC:
@ -574,37 +574,45 @@ get_dynamic_type (type)
switch (type)
{
case DT_NULL: return _("NULL");
case DT_NEEDED: return _("NEEDED");
case DT_PLTRELSZ: return _("PLTRELSZ");
case DT_PLTGOT: return _("PLTGOT");
case DT_HASH: return _("HASH");
case DT_STRTAB: return _("STRTAB");
case DT_SYMTAB: return _("SYMTAB");
case DT_RELA: return _("RELA");
case DT_RELASZ: return _("RELASZ");
case DT_RELAENT: return _("RELAENT");
case DT_STRSZ: return _("STRSZ");
case DT_SYMENT: return _("SYMENT");
case DT_INIT: return _("INIT");
case DT_FINI: return _("FINI");
case DT_SONAME: return _("SONAME");
case DT_RPATH: return _("RPATH");
case DT_SYMBOLIC: return _("SYMBOLIC");
case DT_REL: return _("REL");
case DT_RELSZ: return _("RELSZ");
case DT_RELENT: return _("RELENT");
case DT_PLTREL: return _("PLTREL");
case DT_DEBUG: return _("DEBUG");
case DT_TEXTREL: return _("TEXTREL");
case DT_JMPREL: return _("JMPREL");
case DT_VERDEF: return _("VERDEF");
case DT_VERDEFNUM: return _("VERDEFNUM");
case DT_VERNEED: return _("VERNEED");
case DT_VERNEEDNUM: return _("VERNEEDNUM");
case DT_VERSYM: return _("VERSYN");
case DT_AUXILIARY: return _("AUXILARY");
case DT_FILTER: return _("FILTER");
case DT_NULL: return "NULL";
case DT_NEEDED: return "NEEDED";
case DT_PLTRELSZ: return "PLTRELSZ";
case DT_PLTGOT: return "PLTGOT";
case DT_HASH: return "HASH";
case DT_STRTAB: return "STRTAB";
case DT_SYMTAB: return "SYMTAB";
case DT_RELA: return "RELA";
case DT_RELASZ: return "RELASZ";
case DT_RELAENT: return "RELAENT";
case DT_STRSZ: return "STRSZ";
case DT_SYMENT: return "SYMENT";
case DT_INIT: return "INIT";
case DT_FINI: return "FINI";
case DT_SONAME: return "SONAME";
case DT_RPATH: return "RPATH";
case DT_SYMBOLIC: return "SYMBOLIC";
case DT_REL: return "REL";
case DT_RELSZ: return "RELSZ";
case DT_RELENT: return "RELENT";
case DT_PLTREL: return "PLTREL";
case DT_DEBUG: return "DEBUG";
case DT_TEXTREL: return "TEXTREL";
case DT_JMPREL: return "JMPREL";
case DT_VERDEF: return "VERDEF";
case DT_VERDEFNUM: return "VERDEFNUM";
case DT_VERNEED: return "VERNEED";
case DT_VERNEEDNUM: return "VERNEEDNUM";
case DT_VERSYM: return "VERSYN";
case DT_AUXILIARY: return "AUXILARY";
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:
if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
@ -619,7 +627,7 @@ get_dynamic_type (type)
if (result == NULL)
{
sprintf (buff, _("Processor Specific: (%x)"), type);
sprintf (buff, _("Processor Specific"), type);
result = buff;
}
return result;
@ -1593,20 +1601,20 @@ process_relocs (file)
rel_size = 0;
rel_offset = 0;
if (dynamic_info [DT_REL])
if (dynamic_info[DT_REL])
{
rel_offset = dynamic_info [DT_REL];
rel_size = dynamic_info [DT_RELSZ];
rel_offset = dynamic_info[DT_REL];
rel_size = dynamic_info[DT_RELSZ];
}
else if (dynamic_info [DT_RELA])
{
rel_offset = dynamic_info [DT_RELA];
rel_size = dynamic_info [DT_RELASZ];
rel_offset = dynamic_info[DT_RELA];
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_size = dynamic_info [DT_PLTRELSZ];
rel_offset = dynamic_info[DT_JMPREL];
rel_size = dynamic_info[DT_PLTRELSZ];
}
if (rel_size)
@ -1771,7 +1779,7 @@ process_dynamic_segment (file)
if (entry->d_tag != DT_SYMTAB)
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,
we default to reading in the entire file (!) and
@ -1808,7 +1816,7 @@ process_dynamic_segment (file)
if (entry->d_tag != DT_STRTAB)
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,
we default to reading in the entire file (!) and
@ -1869,6 +1877,58 @@ process_dynamic_segment (file)
}
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_NEEDED :
case DT_PLTRELSZ:
@ -1877,23 +1937,17 @@ process_dynamic_segment (file)
case DT_STRTAB :
case DT_SYMTAB :
case DT_RELA :
case DT_RELASZ :
case DT_RELAENT :
case DT_STRSZ :
case DT_SYMENT :
case DT_INIT :
case DT_FINI :
case DT_SONAME :
case DT_RPATH :
case DT_SYMBOLIC:
case DT_REL :
case DT_RELSZ :
case DT_RELENT :
case DT_PLTREL :
case DT_DEBUG :
case DT_TEXTREL :
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)
{
@ -1934,6 +1988,51 @@ process_dynamic_segment (file)
}
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:
if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
{
@ -2578,7 +2677,7 @@ process_symbol_table (file)
if (! do_syms)
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 nc [4];
@ -2589,7 +2688,7 @@ process_symbol_table (file)
int hn;
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"));
return 0;
@ -3314,11 +3413,10 @@ process_file (file_name)
/* Initialise per file variables. */
for (i = NUM_ELEM (version_info); i--;)
version_info [i] = 0;
version_info[i] = 0;
for (i = NUM_ELEM (dynamic_info); i--;)
dynamic_info [i] = 0;
dynamic_info[i] = 0;
/* Process the file. */
if (show_name)