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.

Reply via email to