https://sourceware.org/bugzilla/show_bug.cgi?id=32242
Bug ID: 32242 Summary: LTO doesn't work with wrappers of GCC builtin functions Product: binutils Version: 2.44 (HEAD) Status: NEW Severity: normal Priority: P2 Component: ld Assignee: unassigned at sourceware dot org Reporter: hjl.tools at gmail dot com Target Milestone: --- LTO doesn't work with wrappers of GCC builtin functions. Without LTO, wrappers are used: [hjl@gnu-tgl-3 pr32241]$ cat pr32241a.c #include <stdio.h> #include <stdlib.h> extern void *bar (size_t); extern void func1 (void); int main() { void *ptr = bar (200); free (ptr); func1 (); printf ("PASS\n"); return 0; } [hjl@gnu-tgl-3 pr32241]$ cat pr32241b.c #include <stdlib.h> #include <dlfcn.h> extern void foo (void *); static void *(*__real_malloc) (size_t) = NULL; void check (void * ptr) { foo (ptr); } void * malloc (size_t size) { if (__real_malloc == NULL) __real_malloc = (void*(*)(size_t))dlsym (RTLD_NEXT, "malloc"); void *p = __real_malloc (size); check (p); return p; } [hjl@gnu-tgl-3 pr32241]$ cat pr32241c.c #include <stdlib.h> void foo (void * ptr) { if (ptr == NULL) abort (); } void * bar (size_t size) { return malloc (size); } void func1 (void) { } [hjl@gnu-tgl-3 pr32241]$ make gcc -B./ -g -O0 -c -o pr32241a.o pr32241a.c gcc -B./ -g -O0 -c -o pr32241b.o pr32241b.c ar -rv libx.a pr32241b.o ar: creating libx.a a - pr32241b.o gcc -B./ -g -O0 -c -o pr32241c.o pr32241c.c ar -rv libx.a pr32241c.o a - pr32241c.o gcc -B./ -g -O0 -o x pr32241a.o libx.a -ldl ./x PASS objdump -dw x | grep "<malloc>:" 0000000000400555 <malloc>: objdump -dw x | grep malloc@plt make: [Makefile:18: all] Error 1 (ignored) [hjl@gnu-tgl-3 pr32241]$ With LTO, wrappers are unused: [hjl@gnu-tgl-3 pr32241]$ make gcc -B./ -g -O0 -flto=auto -c -o pr32241a.o pr32241a.c gcc -B./ -g -O0 -flto=auto -c -o pr32241b.o pr32241b.c ar -rv libx.a pr32241b.o ar: creating libx.a a - pr32241b.o gcc -B./ -g -O0 -flto=auto -c -o pr32241c.o pr32241c.c ar -rv libx.a pr32241c.o a - pr32241c.o gcc -B./ -g -O0 -flto=auto -o x pr32241a.o libx.a -ldl ./x PASS objdump -dw x | grep "<malloc>:" make: [Makefile:17: all] Error 1 (ignored) objdump -dw x | grep malloc@plt 00000000004003d0 <malloc@plt>: 40052c: e8 9f fe ff ff call 4003d0 <malloc@plt> [hjl@gnu-tgl-3 pr32241]$ With fat LTO, it won't build: [hjl@gnu-tgl-3 pr32241]$ make gcc -B./ -g -O0 -flto=auto -ffat-lto-objects -c -o pr32241a.o pr32241a.c gcc -B./ -g -O0 -flto=auto -ffat-lto-objects -c -o pr32241b.o pr32241b.c ar -rv libx.a pr32241b.o ar: creating libx.a a - pr32241b.o gcc -B./ -g -O0 -flto=auto -ffat-lto-objects -c -o pr32241c.o pr32241c.c ar -rv libx.a pr32241c.o a - pr32241c.o gcc -B./ -g -O0 -flto=auto -ffat-lto-objects -o x pr32241a.o libx.a -ldl ./ld: libx.a(pr32241b.o): in function `check': /export/home/hjl/bugs/binutils/pr32241/pr32241b.c:11:(.text+0x14): undefined reference to `foo' collect2: error: ld returned 1 exit status make: *** [Makefile:21: x] Error 1 [hjl@gnu-tgl-3 pr32241]$ -- You are receiving this mail because: You are on the CC list for the bug.