fake symbols to aid debugging

Daniel Jacobowitz drow@mvista.com
Tue Jul 29 03:11:00 GMT 2003


On Tue, Jul 29, 2003 at 12:02:58PM +0930, Alan Modra wrote:
> PowerPC64 (and other architechures) use linker stubs for various things,
> most notably to make calls to functions in shared objects.  Typical
> disassembly looks like:
> 
> the stub
>   7ea138:       3d 82 00 01     addis   r12,r2,1
>   7ea13c:       f8 41 00 28     std     r2,40(r1)
>   7ea140:       e9 6c 11 88     ld      r11,4488(r12)
>   7ea144:       e8 4c 11 90     ld      r2,4496(r12)
>   7ea148:       7d 69 03 a6     mtctr   r11
>   7ea14c:       e9 6c 11 98     ld      r11,4504(r12)
>   7ea150:       4e 80 04 20     bctr
> 
> call to stub
>   87d6f0:       e8 7e 80 90     ld      r3,-32624(r30)
>   87d6f4:       4b f6 ca 45     bl      7ea138 <._init+0xe9b8>
>   87d6f8:       e8 41 00 28     ld      r2,40(r1)
> 
> Note the meaningless symbol given as target for the "bl".  Now, if you
> know enough about the ABI, it's possible to figure out which function is
> being called, but that's a pain.  In the case of PowerPC64 you need to
> a) Find the value of r2 by looking at the calling function's opd entry.
>    (with multiple GOT/TOC r2 is not fixed).
> b) Perform the calculation done by the stub to find the plt entry
>    address. 
> c) Search the relocs to find the one for this particular plt entry.
>    The symbol on the reloc gives the function name.
> 
> I waste enough time doing this that I figure it's worth doing something
> about it.  My first idea, already implemented, was to have the linker
> emit extra symbols to identify the stubs.  This works well but bloats
> the symbol table and isn't on by default.  A better idea would be to
> create the stub symbols on the fly.  With that in mind, I propose to
> add two new bfd functions
> 
> long bfd_get_fake_symtab_upper_bound (bfd *abfd);
> long bfd_canonicalize_fake_symtab (bfd *abfd, asymbol **buf);
> 
> analogous to bfd_get_symtab_upper_bound and bfd_canonicalize_symtab.
> 
> Comments?

I may regret suggesting this... outgrowth of a similar conversation
with Jim a month or so ago.  Would it be feasible for the linker to
generate a DWARF compilation unit for these stubs, and fill it with
DW_AT_trampoline markers?  One of the forms of DW_AT_trampoline is just
a string which gives the function name, which is all you'd want from
what you said above.

As link-time DWARF generation goes this is a pretty simple one; you'd
only need one form.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer



More information about the Binutils mailing list