This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]