mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@aerifal.cx>
To: musl@lists.openwall.com
Subject: Re: How to build libc.a with -fPIC for all archive members?
Date: Mon, 10 Feb 2014 14:43:34 -0500	[thread overview]
Message-ID: <20140210194334.GU15627@brightrain.aerifal.cx> (raw)
In-Reply-To: <52F8C782.4060308@f-prot.com>

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


      parent reply	other threads:[~2014-02-10 19:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-10 12:35 Oliver Schneider
2014-02-10 13:27 ` Oliver Schneider
2014-02-10 14:04   ` Oliver Schneider
2014-02-10 14:07 ` Szabolcs Nagy
2014-02-10 19:43 ` Rich Felker [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140210194334.GU15627@brightrain.aerifal.cx \
    --to=dalias@aerifal.cx \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).