This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: gold: Something special about malloc/calloc/realloc/free symbols?


On 01/08/2017 06:31 AM, Paul Smith wrote:
Hi all.  I have a weird situation and I don't know what to try next.

I'm creating a .so (on GNU/Linux using GCC 6.2 an binutils 2.27) and I
want to export only a specific set of symbols.  To do this I create a
linker map like this:

  {
      global:
          symbol_one;
          symbol_two;
            ...
      local:
          *;
  };

and I add it to my link line with -Wl,version-script=...

You also need to export _IO_stdin_used if it is defined by libc_nonshared.a. I have not yet found a good way to clean this up on the glibc side.

It all works great, except for one thing.  In my shared library I'm also
linking a memory management library (linked as a .a) which replaces all
the standard memory functions: malloc, calloc, realloc, free.  I don't
want these to be published by my .so because I want only my library to
be able to access them, not a program that links my library.

This happens automatically to enable symbol interposition.

If you avoid symbol interposition, you will not be able to use quite a few glibc functions (strdup, getline, asprintf, realpath with a NULL argument, to name a few examples), and you must make sure that your library does not call realloc or free on a pointer supplied by the application (or the application does not call realloc or free on a pointer obtained from the library).

The best way to deal with this is to rename the allocator functions in the source code. If that's not possible, maybe you can use a partial link (ld -r) with --wrap or some other ld functionality which renames the symbols.

Florian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]