[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Bug ld/32242] New: LTO doesn't work with wrappers of GCC builtin functi
From: |
hjl.tools at gmail dot com |
Subject: |
[Bug ld/32242] New: LTO doesn't work with wrappers of GCC builtin functions |
Date: |
Sun, 06 Oct 2024 05:51:08 +0000 |
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.
- [Bug ld/32242] New: LTO doesn't work with wrappers of GCC builtin functions,
hjl.tools at gmail dot com <=