This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Does the LD --wrap feature work for library internal references?
On 18/01/2019 14:41, Alan Modra wrote:
On Fri, Jan 18, 2019 at 10:04:36AM +0100, Sebastian Huber wrote:
On 18/01/2019 01:24, Alan Modra wrote:
No, -ffunction-sections will make no difference. Really, --wrap was
intended for wrapping system functions, which I guess is why the
feature was implemented only for undefined symbols. I don't see a
fundamental reason why --wrap couldn't be made to work with defined
symbols, provided the compiler and assembler don't optimise references
to local functions.
In case it is acceptable to extend --wrap to work also for defined symbol
references, then I would have a look at this and try to implement it. If you
already have an idea which functions needs to be touched for this new
feature, then this would be helpful for me.
It might just be a matter of calling bfd_wrapped_link_hash_lookup in
more places where we currently call bfd_link_hash_lookup and its
derivatives like elf_link_hash_lookup. Knowing which places to change
is the difficult part. Anything involved with relocation processing
for a start.
I think to wrap defined references you have to add things to other
places than spots which call bfd_link_hash_lookup() or
bfd_wrapped_link_hash_lookup(). I built ld with -O0 -g and used the
following test program:
void f(void)
{
}
void g(void);
void _start(void)
{
f();
g();
}
I use this GDB script:
b bfd_wrapped_link_hash_lookup if string[0] != '.' && (string[0] == 'f'
|| string[7] == 'f' || string[0] == 'g' || string[7] == 'g')
commands
c
end
b bfd_link_hash_lookup if string[0] != '.' && (string[0] == 'f' ||
string[7] == 'f' || string[0] == 'g' || string[7] == 'g')
commands
c
end
r
This yields:
gdb --command=main.gdb --args ld-new -wrap=f -wrap=g main.o -o main.exe
Breakpoint 2, bfd_link_hash_lookup (table=0x8df4f0, string=0x8f2bd0 "f",
create=1, copy=0, follow=0) at ../../bfd/linker.c:511
511 if (table == NULL || string == NULL)
Breakpoint 2, bfd_link_hash_lookup (table=0x8df4f0, string=0x8f2bd2
"_start", create=1, copy=0, follow=0) at ../../bfd/linker.c:511
511 if (table == NULL || string == NULL)
Breakpoint 1, bfd_wrapped_link_hash_lookup (abfd=0x8eec40, info=0x8c2de0
<link_info>, string=0x8f2bd9 "g", create=1, copy=0, follow=0) at
../../bfd/linker.c:541
541 if (info->wrap_hash != NULL)
Breakpoint 2, bfd_link_hash_lookup (table=0x8df4f0, string=0x8f35c0
"__wrap_g", create=1, copy=1, follow=0) at ../../bfd/linker.c:511
511 if (table == NULL || string == NULL)
/home/EB/sebastian_h/archive/binutils-git/build/ld/ld-new: main.o: in
function `_start':
main.c:(.text+0x11): undefined reference to `__wrap_g'
The lookup is performed only once for "f". I think this is when ld finds
the definition of f(). For the call in _start() we end up in other areas
of ld.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.