public inbox for frysk@sourceware.org
 help / color / mirror / Atom feed
From: Roland McGrath <roland@redhat.com>
To: Andrew Cagney <cagney@redhat.com>
Cc: frysk@sourceware.org
Subject: Re: which elf symbol?
Date: Thu, 26 Jul 2007 02:27:00 -0000	[thread overview]
Message-ID: <20070726022738.4350E4D058D@magilla.localdomain> (raw)
In-Reply-To: Andrew Cagney's message of  Monday, 23 July 2007 12:58:01 -0400 <46A4DE19.4000200@redhat.com>

I reduced your report to an isolated test case of trivial assembly.  I've
slightly modified addr2line so I'm using it as a test program with -e on
the .o file to just print out the results of dwfl_module_addrsym.
Please help me adjust this test case to match (or also include) cases
equivalent to what you are seeing.

		.globl t1_global_outer

	t1_local_st_size_0:

	t1_global_outer:
		nop
	t1_local_in_global:
		nop
	.size t1_local_in_global, .-t1_local_in_global
	1:	nop
	      .size t1_global_outer, .-t1_global_outer

	.space 100
	.balign 8

		.globl t2_global_symbol

	t2_local_st_size_0:

	t2_global_symbol:
	      nop
	      nop
	.size t2_global_symbol, .-t2_global_symbol
	2:

	.space 100
	.balign 8

		.globl t3_global_after_0

	t3_global_after_0:
		nop
	t3_local_0_in_global:
	3:
	      nop
	      .size t3_global_after_0, .-t3_global_after_0

	.data
	t1_pc_of_interest: .long 1b
	t2_pc_of_interest: .long 2b
	t3_pc_of_interest: .long 3b

as on that produces the following (readelf -rs; objdump -d).  The reloc
addends tell you the "pc_of_interest" values.  On i386 (non-rela), you'd
need to look at objdump -s -j .data instead to see them.

	Relocation section '.rela.data' at offset 0x560 contains 3 entries:
	  Offset          Info           Type           Sym. Value    Sym. Name + Addend
	000000000000  00010000000a R_X86_64_32       0000000000000000 .text + 2
	000000000004  00010000000a R_X86_64_32       0000000000000000 .text + 6a
	000000000008  00010000000a R_X86_64_32       0000000000000000 .text + d1

	Symbol table '.symtab' contains 14 entries:
	   Num:    Value          Size Type    Bind   Vis      Ndx Name
	     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
	     1: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
	     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 
	     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
	     4: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 t1_local_st_size_0
	     5: 0000000000000001     1 NOTYPE  LOCAL  DEFAULT    1 t1_local_in_global
	     6: 0000000000000068     0 NOTYPE  LOCAL  DEFAULT    1 t2_local_st_size_0
	     7: 00000000000000d1     0 NOTYPE  LOCAL  DEFAULT    1 t3_local_0_in_global
	     8: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    2 t1_pc_of_interest
	     9: 0000000000000004     0 NOTYPE  LOCAL  DEFAULT    2 t2_pc_of_interest
	    10: 0000000000000008     0 NOTYPE  LOCAL  DEFAULT    2 t3_pc_of_interest
	    11: 0000000000000000     3 NOTYPE  GLOBAL DEFAULT    1 t1_global_outer
	    12: 0000000000000068     2 NOTYPE  GLOBAL DEFAULT    1 t2_global_symbol
	    13: 00000000000000d0     2 NOTYPE  GLOBAL DEFAULT    1 t3_global_after_0

	addrsym-test.o:     file format elf64-x86-64

	Disassembly of section .text:

	0000000000000000 <t1_global_outer>:
	   0:	90                   	nop    

	0000000000000001 <t1_local_in_global>:
	   1:	90                   	nop    
	   2:	90                   	nop    
		...
	  67:	90                   	nop    

	0000000000000068 <t2_global_symbol>:
	  68:	90                   	nop    
	  69:	90                   	nop    
		...
	  ce:	66 90                	xchg   %ax,%ax

	00000000000000d0 <t3_global_after_0>:
	  d0:	90                   	nop    

	00000000000000d1 <t3_local_0_in_global>:
	  d1:	90                   	nop    

It's possible the order of symbols in the table is an issue.  So let me
know if those are different in your case.  

>     local_st_size_0: // this symbol has no size
> 
>     global_outer:
>         nop
>         local_in_global:
>           nop
>           .size local_in_global, .-local_in_global
>        nop
>        <<you-are-here>>
>        .size global_outer, .-global_outer
> 
> that is global_outer contains a nested symbol but the "pc" is beyond 
> that back in the outer/global symbol.
> 
> I'm guessing that "global_outer" should be returned.  Currently 
> local_st_size_0 is returned :-(

Arguably the answer should be no symbol, since the address is past the end
of the nearest symbol's size.

This is t1 in my test case, looking at pc=0x2.  I get t1_global_outer+0x2
from addrsym here, so my case must differ from what you tried here.
Can you figure out how they differ?

> This is the no-symbol case, there is a hole in the memory where there is 
> no valid symbol vis:
> 
>     local_st_size_0: // this symbol has no size
> 
>     global_symbol:
>        nop
>        nop
>        .size global_symbol, .-global_symbol
> 
>     << you are here >>
> 
> I'm guessing it should not get a symbol at all (the [unknown]).  It 
> currently gets the nearest unsized symbol.

This is t2 in my test case, looking at pc=0x6a.  
I get t2_local_st_size_0+0x2 here.  Go figure.

You wrote your marker in a different place, but there is no address
difference between the context before the .size directive in the assembly
source and the context after it.  So unless I'm misunderstanding what cases
you intended to describe, this should be the same case as t1.  (It doesn't
really matter that there is a local symbol nearby, since the PC of interest
is unambiguous outside that symbol's address range.)

I'll look into why they come out differently, which might relate to some
other symptom.  I also agree that the right answer is no symbol.

> These are cases where there is a nested symbol within a sized symbol vis:
> 
>     global_after_0:
>        nop
>        local_0_in_global:
>           << you are here >>
>        nop
>        .size global_after_0, .-global_after_0
> 
> here, since the PC is exactly at the unsized local symbol I'm guessing 
> that it should return that.  It currently gets the containing sized symbol.

This is my t3.  I get t3_global_after_0+0x1 as you say.  This is the
intended behavior, not a bug.  We can discuss what the behavior should be.  

	  /* Handwritten assembly symbols sometimes have no st_size.
	     If no symbol with proper size includes the address, we'll
	     use the closest one that is in the same section as ADDR.   */

Usually size-0 symbols are local assembler labels, and sized symbols are
the entry points.  For things like backtraces, people usually want to see
the symbol names for the entry points (plus offsets) rather than the local
labels that often have unhelpful names.  That's what I had in mind when I
wrote that.  addrsym started out as addrname, which does not pass back an
offset and only used for "what function is this in?" kinds of queries.  For
that, it clearly makes more sense to prefer the containing sized symbol.

However, for things like disassembly, people probably would like to see the
local label names, or perhaps both names.  


Thanks,
Roland

  reply	other threads:[~2007-07-26  2:27 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-23 16:57 Andrew Cagney
2007-07-26  2:27 ` Roland McGrath [this message]
2007-07-26 22:30   ` Andrew Cagney
2007-08-07  7:52     ` Roland McGrath

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070726022738.4350E4D058D@magilla.localdomain \
    --to=roland@redhat.com \
    --cc=cagney@redhat.com \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).