This is the mail archive of the binutils@sourceware.org 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]

Improve obdump symbol filtering.


Objdump (find_symbol_for_address) currently has logic to avoid certain 
target-specific symbols when printing the symbol for an address. This is used 
on ARM to skip mapping symbols.

The current logic for this is rather lame, and only really works if there is a 
regular symbol at the same address as the mapping symbol.

Fortunately find_symbol_for_address already has reasonably sophisticated logic 
for finding a symbol in a particular section. The attached patch merges the 
target constraints into that logic.

Arm is currently the only target that this effects. The behavior of other 
targets should be identical before and after this patch.

Tested on i686-linux, arm-none-eabi and arm-elf.
Ok?

Paul

2007-05-21  Paul Brook  <paul@codesourcery.com>

	bunutils/
	* objdump.c (find_symbol_for_address): Merge section and target
	specific filtering code.

	ld/testsuite/
	* ld-arm-mixed-lib.d: Update expected output.
	* ld-arm/arm-app.d: Ditto.
	* ld-arm/mixed-app.d: Ditto.
	* ld-arm/arm-lib-plt32.d: Ditto.
	* ld-arm/arm-app-abs32.d: Ditto.
	* ld-arm/mixed-app-v5.d: Ditto.
	* ld-arm/armthumb-lib.d: Ditto.
	* ld-arm/arm-lib.d: Ditto.

	gas/testsuite/
	* gas/arm/backslash-at.d: Update expected output.
Index: binutils/objdump.c
===================================================================
--- binutils/objdump.c	(revision 171561)
+++ binutils/objdump.c	(working copy)
@@ -687,6 +687,7 @@ find_symbol_for_address (bfd_vma vma,
   bfd *abfd;
   asection *sec;
   unsigned int opb;
+  bfd_boolean want_section;
 
   if (sorted_symcount < 1)
     return NULL;
@@ -732,15 +733,19 @@ find_symbol_for_address (bfd_vma vma,
      Note that this may be wrong for some symbol references if the
      sections have overlapping memory ranges, but in that case there's
      no way to tell what's desired without looking at the relocation
-     table.  */
-  if (sorted_syms[thisplace]->section != sec
-      && (aux->require_sec
-	  || ((abfd->flags & HAS_RELOC) != 0
-	      && vma >= bfd_get_section_vma (abfd, sec)
-	      && vma < (bfd_get_section_vma (abfd, sec)
-			+ bfd_section_size (abfd, sec) / opb))))
+     table.
+     
+     Also give the target a chance to reject symbols.  */
+  want_section = (aux->require_sec
+		  || ((abfd->flags & HAS_RELOC) != 0
+		      && vma >= bfd_get_section_vma (abfd, sec)
+		      && vma < (bfd_get_section_vma (abfd, sec)
+				+ bfd_section_size (abfd, sec) / opb)));
+  if ((sorted_syms[thisplace]->section != sec && want_section)
+      || !info->symbol_is_valid (sorted_syms[thisplace], info))
     {
       long i;
+      long newplace;
 
       for (i = thisplace + 1; i < sorted_symcount; i++)
 	{
@@ -750,27 +755,36 @@ find_symbol_for_address (bfd_vma vma,
 	}
 
       --i;
+      newplace = sorted_symcount;
 
       for (; i >= 0; i--)
 	{
-	  if (sorted_syms[i]->section == sec
-	      && (i == 0
-		  || sorted_syms[i - 1]->section != sec
-		  || (bfd_asymbol_value (sorted_syms[i])
-		      != bfd_asymbol_value (sorted_syms[i - 1]))))
+	  if ((sorted_syms[i]->section == sec || !want_section)
+	      && info->symbol_is_valid (sorted_syms[i], info))
 	    {
-	      thisplace = i;
-	      break;
+	      if (newplace == sorted_symcount)
+		newplace = i;
+
+	      if (bfd_asymbol_value (sorted_syms[i])
+		  != bfd_asymbol_value (sorted_syms[newplace]))
+		break;
+
+	      /* Remember this symbol and keep searching until we reach
+		 an earlier address.  */
+	      newplace = i;
 	    }
 	}
 
-      if (sorted_syms[thisplace]->section != sec)
+      if (newplace != sorted_symcount)
+	thisplace = newplace;
+      else
 	{
 	  /* We didn't find a good symbol with a smaller value.
 	     Look for one with a larger value.  */
 	  for (i = thisplace + 1; i < sorted_symcount; i++)
 	    {
-	      if (sorted_syms[i]->section == sec)
+	      if ((sorted_syms[i]->section == sec || !want_section)
+		  && info->symbol_is_valid (sorted_syms[i], info))
 		{
 		  thisplace = i;
 		  break;
@@ -778,25 +792,12 @@ find_symbol_for_address (bfd_vma vma,
 	    }
 	}
 
-      if (sorted_syms[thisplace]->section != sec
-	  && (aux->require_sec
-	      || ((abfd->flags & HAS_RELOC) != 0
-		  && vma >= bfd_get_section_vma (abfd, sec)
-		  && vma < (bfd_get_section_vma (abfd, sec)
-			    + bfd_section_size (abfd, sec)))))
+      if ((sorted_syms[thisplace]->section != sec && want_section)
+	  || !info->symbol_is_valid (sorted_syms[thisplace], info))
 	/* There is no suitable symbol.  */
 	return NULL;
     }
 
-  /* Give the target a chance to reject the symbol.  */
-  while (! info->symbol_is_valid (sorted_syms [thisplace], info))
-    {
-      ++ thisplace;
-      if (thisplace >= sorted_symcount
-	  || bfd_asymbol_value (sorted_syms [thisplace]) > vma)
-	return NULL;
-    }
-
   if (place != NULL)
     *place = thisplace;
 
Index: ld/testsuite/ld-arm/mixed-lib.d
===================================================================
--- ld/testsuite/ld-arm/mixed-lib.d	(revision 171561)
+++ ld/testsuite/ld-arm/mixed-lib.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
  .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
- .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+ .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <lib_func1-0x1c>
  .*:	e08fe00e 	add	lr, pc, lr
  .*:	e5bef008 	ldr	pc, \[lr, #8\]!
  .*:	.*
@@ -20,7 +20,7 @@ Disassembly of section .text:
 .* <lib_func1>:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
- .*:	ebfffff. 	bl	.* <.text-0x..?>
+ .*:	ebfffff. 	bl	.* <lib_func1-0x..?>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
  .*:	e1a00000 	nop			\(mov r0,r0\)
Index: ld/testsuite/ld-arm/arm-app.d
===================================================================
--- ld/testsuite/ld-arm/arm-app.d	(revision 171561)
+++ ld/testsuite/ld-arm/arm-app.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
  .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
- .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+ .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <_start-0x10>
  .*:	e08fe00e 	add	lr, pc, lr
  .*:	e5bef008 	ldr	pc, \[lr, #8\]!
  .*:	.*
@@ -27,7 +27,7 @@ Disassembly of section .text:
 .* <app_func>:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
- .*:	ebfffff4 	bl	.* <.text-0xc>
+ .*:	ebfffff4 	bl	.* <_start-0xc>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
 
Index: ld/testsuite/ld-arm/mixed-app.d
===================================================================
--- ld/testsuite/ld-arm/mixed-app.d	(revision 171561)
+++ ld/testsuite/ld-arm/mixed-app.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
  .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
- .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+ .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <_start-0x2c>
  .*:	e08fe00e 	add	lr, pc, lr
  .*:	e5bef008 	ldr	pc, \[lr, #8\]!
  .*:	.*
@@ -50,7 +50,7 @@ Disassembly of section .text:
 
 .* <app_tfunc>:
  .*:	b500      	push	{lr}
- .*:	f7ff ffc. 	bl	.* <.text-0x..>
+ .*:	f7ff ffc. 	bl	.* <_start-0x..>
  .*:	bd00      	pop	{pc}
  .*:	4770      	bx	lr
  .*:	46c0      	nop			\(mov r8, r8\)
Index: ld/testsuite/ld-arm/arm-lib-plt32.d
===================================================================
--- ld/testsuite/ld-arm/arm-lib-plt32.d	(revision 171561)
+++ ld/testsuite/ld-arm/arm-lib-plt32.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
  .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
- .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+ .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <lib_func1-0x10>
  .*:	e08fe00e 	add	lr, pc, lr
  .*:	e5bef008 	ldr	pc, \[lr, #8\]!
  .*:	.*
@@ -20,7 +20,7 @@ Disassembly of section .text:
 .* <lib_func1>:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
- .*:	ebfffff9 	bl	.* <\.text-0xc>
+ .*:	ebfffff9 	bl	.* <lib_func1-0xc>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
 
Index: ld/testsuite/ld-arm/arm-app-abs32.d
===================================================================
--- ld/testsuite/ld-arm/arm-app-abs32.d	(revision 171561)
+++ ld/testsuite/ld-arm/arm-app-abs32.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
     .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
-    .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+    .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <_start-0x10>
     .*:	e08fe00e 	add	lr, pc, lr
     .*:	e5bef008 	ldr	pc, \[lr, #8\]!
     .*:	.* 	.*
@@ -20,7 +20,7 @@ Disassembly of section .text:
 .* <_start>:
     .*:	e1a0c00d 	mov	ip, sp
     .*:	e92dd800 	push	{fp, ip, lr, pc}
-    .*:	e59f0004 	ldr	r0, \[pc, #4\]	; .* <.text\+0x14>
+    .*:	e59f0004 	ldr	r0, \[pc, #4\]	; .* <_start\+0x14>
     .*:	e89d6800 	ldm	sp, {fp, sp, lr}
     .*:	e12fff1e 	bx	lr
     .*:	.* 	.*
Index: ld/testsuite/ld-arm/mixed-app-v5.d
===================================================================
--- ld/testsuite/ld-arm/mixed-app-v5.d	(revision 171561)
+++ ld/testsuite/ld-arm/mixed-app-v5.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
  .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
- .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+ .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <_start-0x1c>
  .*:	e08fe00e 	add	lr, pc, lr
  .*:	e5bef008 	ldr	pc, \[lr, #8\]!
  .*:	.*
@@ -48,7 +48,7 @@ Disassembly of section .text:
 
 .* <app_tfunc>:
  .*:	b500      	push	{lr}
- .*:	f7ff efc. 	blx	.* <.text-0x..>
+ .*:	f7ff efc. 	blx	.* <_start-0x..>
  .*:	bd00      	pop	{pc}
  .*:	4770      	bx	lr
  .*:	46c0      	nop			\(mov r8, r8\)
Index: ld/testsuite/ld-arm/armthumb-lib.d
===================================================================
--- ld/testsuite/ld-arm/armthumb-lib.d	(revision 171561)
+++ ld/testsuite/ld-arm/armthumb-lib.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
  .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
- .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+ .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <lib_func1-0x1c>
  .*:	e08fe00e 	add	lr, pc, lr
  .*:	e5bef008 	ldr	pc, \[lr, #8\]!
  .*:	.*
@@ -20,7 +20,7 @@ Disassembly of section .text:
 .* <lib_func1>:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
- .*:	ebfffff. 	bl	.* <.text-0x..?>
+ .*:	ebfffff. 	bl	.* <lib_func1-0x..?>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
  .*:	e1a00000 	nop			\(mov r0,r0\)
Index: ld/testsuite/ld-arm/arm-lib.d
===================================================================
--- ld/testsuite/ld-arm/arm-lib.d	(revision 171561)
+++ ld/testsuite/ld-arm/arm-lib.d	(working copy)
@@ -8,7 +8,7 @@ Disassembly of section .plt:
 
 .* <.plt>:
  .*:	e52de004 	push	{lr}		; \(str lr, \[sp, #-4\]!\)
- .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <\.plt\+0x10>
+ .*:	e59fe004 	ldr	lr, \[pc, #4\]	; .* <lib_func1-0x10>
  .*:	e08fe00e 	add	lr, pc, lr
  .*:	e5bef008 	ldr	pc, \[lr, #8\]!
  .*:	.*
@@ -20,7 +20,7 @@ Disassembly of section .text:
 .* <lib_func1>:
  .*:	e1a0c00d 	mov	ip, sp
  .*:	e92dd800 	push	{fp, ip, lr, pc}
- .*:	ebfffff9 	bl	.* <\.text-0xc>
+ .*:	ebfffff9 	bl	.* <lib_func1-0xc>
  .*:	e89d6800 	ldm	sp, {fp, sp, lr}
  .*:	e12fff1e 	bx	lr
 
Index: gas/testsuite/gas/arm/backslash-at.d
===================================================================
--- gas/testsuite/gas/arm/backslash-at.d	(revision 171561)
+++ gas/testsuite/gas/arm/backslash-at.d	(working copy)
@@ -4,7 +4,7 @@
 .*:     file format .*arm.*
 
 Disassembly of section .text:
-00000000 <.text> 615c      	.short	0x615c
+00000000 <foo-0x2> 615c      	.short	0x615c
 00000002 <foo> e3a00000 	mov	r0, #0	; 0x0
 00000006 <foo\+0x4> e3a00000 	mov	r0, #0	; 0x0
 0000000a <foo\+0x8> e3a00000 	mov	r0, #0	; 0x0

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