mailing list of musl libc
 help / color / mirror / code / Atom feed
* gcc'c crtstuff.c: a musl-related experience
@ 2014-06-15 21:36 writeonce
  2014-06-16  1:41 ` Rich Felker
  0 siblings, 1 reply; 3+ messages in thread
From: writeonce @ 2014-06-15 21:36 UTC (permalink / raw)
  To: musl

Greetings,

I thought I should share a recent experience that I had while building a 
cross compiler for i686-unknown-linux with x86_64 as a host.  The 
problem I encountered (and now solved) is yet another "penalty" for me 
deviating from the norm, which in this case is gcc's way of hard-coding 
libc-specific features into the toolchain (mglibc, muclibc, etc.)  As my 
toolchain does not provide such options, the compiler was mistakenly 
thinking that glibc was the default, which led to the "incident" I'd 
like to describe.

The two files at stake are gcc/linux.h, and libgcc/crtstuff.c.  In the 
former, a built-in macro named __gnu_linux__ is defined when glibc is 
the toolchain's default libc (OPTION_GLIBC).  In the latter, a macro 
named USE_PT_GNU_EH_FRAME is defined when __gnu_linux__ is defined, 
which accordingly prevents USE_EH_FRAME_REGISTRY from being defined 
shortly thereafter.  The absence of this last macro results in a 
crtbegin.o that is incompatible with musl, at least in some cases (a 
simple c++ application crashes after an exception has been thrown, which 
is how I came to notice it).

The resulting file crtbegin.o is installed in one of the toolchain's 
directories, and is thus shared between all the libc's targeted by the 
toolchain.  This means that when the toolchain's default libc is glibc, 
specifying -mmusl would result in a binary that has an incompatible 
crtbegin.o, at least in the above environment (i686 running on x86_64).

To complete the picture: in the musl-cross toolchains, glibc is _not_ 
the default libc, and __gnu_linux_ is accordingly not defined.  All you 
need to do in order to reproduce the above bug is moving around the 
options so that glibc becomes the default.  With the current code of 
crtstuff.c, one easy way to avoid the bug while still keeping -mglibc, 
-mmusl, etc. is to "manually" define USE_EH_FRAME_REGISTRY.  Not ideal, 
but still works.

zg



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-06-16  4:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-15 21:36 gcc'c crtstuff.c: a musl-related experience writeonce
2014-06-16  1:41 ` Rich Felker
2014-06-16  4:37   ` Rich Felker

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).