This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
readelf loadaddr fix
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: binutils at sources dot redhat dot com
- Cc: rusty at rustcorp dot com dot au
- Date: Sat, 7 Dec 2002 23:21:22 +1030
- Subject: readelf loadaddr fix
Fixes an unwarranted assumption readelf was making about page size in
dynamic objects, and bumps the size of a few vars from int to long.
* readelf.c (process_program_headers): When setting loadaddr, don't
assume segment size is 4k. Use p_align instead.
(loadaddr): Change from int to long.
(dynamic_addr, dynamic_info, version_info): Likewise.
(process_dynamic_segment <syminsz>): Likewise.
(process_dynamic_segment): Adjust print format string.
(rela_addr, rela_size): Delete.
(process_relocs): Formatting.
Committing mainline.
Index: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.183
diff -u -p -r1.183 readelf.c
--- binutils/readelf.c 30 Nov 2002 08:39:41 -0000 1.183
+++ binutils/readelf.c 7 Dec 2002 12:23:52 -0000
@@ -90,10 +90,8 @@
#include "getopt.h"
char *program_name = "readelf";
-unsigned int dynamic_addr;
+unsigned long dynamic_addr;
bfd_size_type dynamic_size;
-unsigned int rela_addr;
-unsigned int rela_size;
char *dynamic_strings;
char *string_table;
unsigned long string_table_length;
@@ -103,9 +101,9 @@ Elf_Internal_Syminfo *dynamic_syminfo;
unsigned long dynamic_syminfo_offset;
unsigned int dynamic_syminfo_nent;
char program_interpreter[64];
-int dynamic_info[DT_JMPREL + 1];
-int version_info[16];
-int loadaddr = 0;
+long dynamic_info[DT_JMPREL + 1];
+long version_info[16];
+long loadaddr = 0;
Elf_Internal_Ehdr elf_header;
Elf_Internal_Shdr *section_headers;
Elf_Internal_Dyn *dynamic_segment;
@@ -3142,8 +3140,14 @@ process_program_headers (file)
{
case PT_LOAD:
if (loadaddr == -1)
- loadaddr = (segment->p_vaddr & 0xfffff000)
- - (segment->p_offset & 0xfffff000);
+ {
+ unsigned long align_mask = -segment->p_align;
+
+ if (align_mask == 0)
+ --align_mask;
+ loadaddr = ((segment->p_vaddr & align_mask)
+ - (segment->p_offset & align_mask));
+ }
break;
case PT_DYNAMIC:
@@ -3787,7 +3791,8 @@ process_relocs (file)
rel_offset, rel_size);
dump_relocations (file, rel_offset - loadaddr, rel_size,
- dynamic_symbols, num_dynamic_syms, dynamic_strings, is_rela);
+ dynamic_symbols, num_dynamic_syms, dynamic_strings,
+ is_rela);
}
else
printf (_("\nThere are no dynamic relocations in this file.\n"));
@@ -4653,7 +4658,7 @@ process_dynamic_segment (file)
/* And find the syminfo section if available. */
if (dynamic_syminfo == NULL)
{
- unsigned int syminsz = 0;
+ unsigned long syminsz = 0;
for (i = 0, entry = dynamic_segment;
i < dynamic_size;
@@ -4703,7 +4708,7 @@ process_dynamic_segment (file)
}
if (do_dynamic && dynamic_addr)
- printf (_("\nDynamic segment at offset 0x%x contains %ld entries:\n"),
+ printf (_("\nDynamic segment at offset 0x%lx contains %ld entries:\n"),
dynamic_addr, (long) dynamic_size);
if (do_dynamic)
printf (_(" Tag Type Name/Value\n"));
--
Alan Modra
IBM OzLabs - Linux Technology Centre