RFC: Add DT_FLAGS_2 and DF_2_GNU_IFUNC
Florian Weimer
fweimer@redhat.com
Fri May 25 22:05:00 GMT 2018
On 05/25/2018 11:58 PM, H.J. Lu wrote:
> On Fri, May 25, 2018 at 2:26 PM, Florian Weimer <fweimer@redhat.com> wrote:
>> On 05/25/2018 11:18 PM, H.J. Lu wrote:
>>
>>>> Still I don't see what this buys you if the LD_PRELOAD object has IFUNCs,
>>>> too.
>>>
>>>
>>> [hjl@gnu-cfl-1 ifunc-2]$ cat bar.c
>>> void
>>> bar (char *dst, const char *src, unsigned int size)
>>> {
>>> __builtin_memmove (dst, src, size);
>>> }
>>> [hjl@gnu-cfl-1 ifunc-2]$ cat main.c
>>> extern void bar (char *, const char *, unsigned int);
>>>
>>> int
>>> main ()
>>> {
>>> char dst[50];
>>> const char src[] =
>>> {
>>> "This is a test"
>>> };
>>> bar (dst, src, sizeof (src));
>>> if (__builtin_memcmp (dst, src, sizeof (src)) != 0)
>>> __builtin_abort ();
>>> return 0;
>>> }
>>> [hjl@gnu-cfl-1 ifunc-2]$ make
>>> gcc -O2 -g -c -o main.o main.c
>>> gcc -O2 -g -fPIC -c -o bar.o bar.c
>>> gcc -shared -z now -o libbar.so bar.o
>>> gcc -z now -o x main.o libbar.so -Wl,-R,.
>>> ./x
>>> [hjl@gnu-cfl-1 ifunc-2]$ LD_PRELOAD=./libmemmove.so ./x
>>> ./x: Relink `./libbar.so' with `./libmemmove.so' for IFUNC symbol
>>> `memmove'
>>> [hjl@gnu-cfl-1 ifunc-2]$
>>
>>
>> This doesn't reproduce for me. The commands above do not produce
>> libmemmove.so. âLD_PRELOAD=./libbar.so ./xâ does not crash here (with a
>> glibc 2.26-derived library that hasn't got my IFUNC scheduler).
(some commands are missing from the reproduction steps)
> https://sourceware.org/bugzilla/show_bug.cgi?id=23240
This is just the old known issue related to symbol interposition and
IFUNC resolvers, where even complete DT_NEEDED information is not
sufficient to perform the relocations in the correct order.
A single bit will not solve this. In your reproducer, add an IFUNC
resolver to libbar.so, and I'm sure the bug will resurface again.
Thanks,
Florian
More information about the Binutils
mailing list