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 Libc-alpha
mailing list