Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date: Mon, 10 Feb 2014 14:43:34 -0500
From: Rich Felker <dalias@...ifal.cx>
To: musl@...ts.openwall.com
Subject: Re: How to build libc.a with -fPIC for all archive members?

On Mon, Feb 10, 2014 at 12:35:14PM +0000, Oliver Schneider wrote:
> Hi,
> 
> how can I build the static library from the musl source, but compiling
> with -fPIC?
> 
> I tried the obvious:
> 
> CFLAGS=-fPIC ./configure --enable-gcc-wrapper --disable-shared
> 
> and then built. But I am getting the following linker error still
> (albeit for a different member function and object file than before):
> 
> /usr/local/musl/lib/libc.a(memmove.o): relocation R_X86_64_PC32 against
> symbol `memcpy' can not be used when making a shared object; recompile
> with -fPIC
> final link failed: Bad value
> 
> The reason I want to do this, is to have a statically linked .so. I.e.
> an .so that has no external dependency other than the system calls. Or
> is this known to conflict with the ever-present glibc in some way?

This is not intended to be possible, and there are many things that
would break. Among them:

- __libc_start_main would never have been called so some necessary
  initialization might not have taken place. At present that's minimal
  and the goal is to keep it minimal so this might have no practical
  consequence, but it's still something that can't be officially
  supported without locking in aspects of the implementation.

- malloc does not support sharing the brk with anything else, in
  particular, whatever malloc implementation is using it in the rest
  of the program outside your DSO. It really _can't_ because there's
  no way it could synchronize use of the brk (since it wouldn't be
  sharing locks with the outside program.

- Anything that touches threads will either expect the thread pointer
  to be setup to point to musl's thread structure, or will attempt to
  set it up. This will conflict with whatever thread structure the
  outside program/glibc/different-version-of-musl is using.

In general, it's only safe to have a single version/copy of any given
library linked into a program. There are some exceptions like libgcc
that use hidden visibility to make it work, but they're the exception,
not the norm. This issue is not unique to libc, but libc probably has
the most ways it's affected.

With that said, building libc.a as PIC _is_ intended to be supported,
not for what you're doing, but for the sake of making static-linked
PIE executables. This is not doable with the official gcc toolchain
but I have a system to make it work without invasive changes, so I
would like to find and fix whatever issue is PIC-incompatible...

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.