dlsym() fails with an executable shared library

Ian Lance Taylor iant@google.com
Thu Dec 8 17:01:00 GMT 2011

Mayank Kaushik <mayank.utexas@gmail.com> writes:

>> > gcc -fPIC -fPIE -pie -o library.so test.c
>> That does not make a shared library.
> I'm curious, why not? It's position independent. "file" says it's a
> shared object:
> $ file ./library.so
> ./library.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
> dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not
> stripped

Sorry, you're right, using -pie does create an ET_DYN file.  So I
suppose that technically it is a shared library.

>> > This can read arguments fine, but dlsym() fails:
>> >
>> > ./library.so: undefined symbol: my_func
>> You can probably fix that problem by linking with -rdynamic.
> Didn't work, unfortunately, same problem.

Worked fine when I tried it.  I built your source code using

gcc -fPIE -pie -o foo.so foo.c -rdynamic

Then I created this file:

#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>

die (const char *msg)
  fprintf (stderr, "%s: %s\n", msg, dlerror ());
  exit (EXIT_FAILURE);

  void *handle = dlopen ("./foo.so", RTLD_LAZY);
  if (handle == NULL)
    die ("dlopen");
  void *sym = dlsym (handle, "my_func");
  if (sym == NULL)
    die ("sym");
  void (*pfn)(int) = (void (*)(int)) sym;
  (*pfn) (3);
  return 0;

gcc -o foo2 foo2.c


Inside my_func: 3


More information about the Gcc-help mailing list