tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: __strong_alias



David Laight <david%l8s.co.uk@localhost> wrote:

> To see what is happening in your test program too at the namelists
> from the program and shared library, and then look at the relocation
> entries (objdump -R) to see what is actually referenced by the call
> foo().

objdump -R reports nothing about foo, either in libtest.so, nor in test
(whether linked with -ltest or not)

nm reports it, thought:

$ nm  libtest.so|grep foo
00000444 T foo
00000430 T libtest_foo

$ nm  test|grep foo
080487a0 W foo
080487a0 T main_foo

objdump -d shows it does not tries to go through PLT:
 8048819:       e8 a2 ff ff ff          call   80487c0 <main_foo>


I modified my test to get closer to weak/strong alias usage around libc:

libstrong.so has __strong_alias(foo, libstrong_foo);
libweak.so has __weak_alias(foo, libweak_foo);
test is linked with -lweak, dlopen() libstrong.so and calls foo().

libweak_foo is invoked. This time objdump -R tells us:

$ objdump -R test|grep foo
080499d0 R_386_JUMP_SLOT   foo

And objdump -d:
 80487f5:       e8 02 fd ff ff          call   80484fc <foo@plt>

This time I get the PLT right, but strong_foo() is still not called.
Does that means that dlopen() never causes strong aliases to override
weak aliases?

-- 
Emmanuel Dreyfus
http://hcpnet.free.fr/pubz
manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index