|
Message-ID: <20140210194334.GU15627@brightrain.aerifal.cx> 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.