STT_GNU_IFUNC definition doesn't work in executable. I have a glibc patch:

http://sourceware.org/ml/libc-alpha/2009-05/msg00182.html

But it doesn't work with static executables. Should we allow
STT_GNU_IFUNC definition in executable at all?


[...@gnu-34 ifunc-2]$ cat prog.c
extern int foo (int);

int
main (void)
{
  foo (-3);
  return 0;
}
[...@gnu-34 ifunc-2]$ cat foo.c
#include <stdio.h>

int global = 1;

static int
minus_one (int x)
{
  printf ("Hello minus_one: %d\n", x);
  return -1;
}

static int
zero (int x) 
{
  printf ("Hello zero: %d\n", x);
  return 0;
}

void * foo_ifunc (void) __asm__ ("foo");
void * foo_ifunc (void) { return global ? minus_one : zero ; }
__asm__(".type foo, %gnu_indirect_function");
[...@gnu-34 ifunc-2]$ make
gcc -B./  -g   -c -o prog.o prog.c
gcc -B./  -g   -c -o foo.o foo.c
gcc -B./  -L. -nostdlib -nostartfiles -o dynamic \
        
-Wl,-dynamic-linker=/export/build/gnu/glibc-sse/build-x86_64-linux/elf/ld-linux-x86-64.so.2
 \
        -Wl,-z,combreloc \
        /export/build/gnu/glibc-sse/build-x86_64-linux/csu/crt1.o
/export/build/gnu/glibc-sse/build-x86_64-linux/csu/crti.o \
        `gcc -B./  --print-file-name=crtbegin.o` \
        prog.o foo.o  -Wl,-rpath,. \
        
-Wl,-rpath=/export/build/gnu/glibc-sse/build-x86_64-linux:/export/build/gnu/glibc-sse/build-x86_64-linux/math
 \
        /export/build/gnu/glibc-sse/build-x86_64-linux/elf/ld-linux-x86-64.so.2 
\
        /export/build/gnu/glibc-sse/build-x86_64-linux/libc.so.6
/export/build/gnu/glibc-sse/build-x86_64-linux/libc_nonshared.a \
        -lgcc -lgcc_eh `gcc --print-file-name=crtend.o` \
        /export/build/gnu/glibc-sse/build-x86_64-linux/csu/crtn.o
./dynamic
   segfault
[...@gnu-34 ifunc-2]$ make static
gcc -B./  -static -nostdlib -nostartfiles -o static \
        /export/build/gnu/glibc-sse/build-x86_64-linux/csu/crt1.o
/export/build/gnu/glibc-sse/build-x86_64-linux/csu/crti.o \
        `gcc -B./  --print-file-name=crtbegin.o` \
        prog.o foo.o  \
        /export/build/gnu/glibc-sse/build-x86_64-linux/libc.a  \
        -lgcc -lgcc_eh \
        /export/build/gnu/glibc-sse/build-x86_64-linux/libc.a  \
        `gcc -B./  --print-file-name=crtend.o` \
        /export/build/gnu/glibc-sse/build-x86_64-linux/csu/crtn.o
[...@gnu-34 ifunc-2]$ ./static 
[...@gnu-34 ifunc-2]$

-- 
           Summary: STT_GNU_IFUNC definition doesn't work in executable
           Product: binutils
           Version: 2.20 (HEAD)
            Status: NEW
          Severity: normal
          Priority: P2
         Component: ld
        AssignedTo: unassigned at sources dot redhat dot com
        ReportedBy: hjl dot tools at gmail dot com
                CC: bug-binutils at gnu dot org,nickc at redhat dot com


http://sourceware.org/bugzilla/show_bug.cgi?id=10205

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.


_______________________________________________
bug-binutils mailing list
bug-binutils@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-binutils

Reply via email to