Mercurial > hg > aboriginal
changeset 367:b375712e7634
Fix from Joe Soroka for uClibc static linking issue preventing gcc from
building statically linked against uClibc.
author | Rob Landley <rob@landley.net> |
---|---|
date | Fri, 18 Jul 2008 08:58:09 -0500 |
parents | 03d1f75d2059 |
children | 2c5b02b47c8e |
files | sources/patches/uClibc-static-segfaults.patch |
diffstat | 1 files changed, 88 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/patches/uClibc-static-segfaults.patch Fri Jul 18 08:58:09 2008 -0500 @@ -0,0 +1,88 @@ +From joe@joesoroka.com Thu Jul 17 18:36:26 2008 + +I noticed in your July +13th blog entry that you've hit the uClibc static segfaulting bug. I'm +really surprised no one fixed this before because it was the first thing +I did with my first uClibc toolchain. 'int main(){return 0;}' is like +the Ur-loWorld of toolchainery, especially when one is concerned with +static-binary-byte-bloat which seems to be an obsession of uClibbers. + +Anyway, that was about 4 days ago so you've probably fixed it by now, +but just in case you haven't I'm passing along my patch for it. (Not to +worry, I haven't released anything yet so there's no GPL violation, and +I'm hereby putting my patch into the public domain in case you want to +submit it to uClibc) + +diff -ru uClibc-0.9.29-old/libc/misc/internals/__uClibc_main.c uClibc-0.9.29/libc/misc/internals/__uClibc_main.c +--- uClibc-0.9.29-old/libc/misc/internals/__uClibc_main.c 2007-01-11 16:39:13.000000000 -0600 ++++ uClibc-0.9.29/libc/misc/internals/__uClibc_main.c 2007-09-15 07:13:18.000000000 -0500 +@@ -79,13 +79,17 @@ + * Prototypes. + */ + extern void weak_function _stdio_init(void) attribute_hidden; ++static void __weakstub (void) { return; } ++weak_alias (__weakstub, _stdio_init) + extern int *weak_const_function __errno_location(void); + extern int *weak_const_function __h_errno_location(void); + #ifdef __UCLIBC_HAS_LOCALE__ + extern void weak_function _locale_init(void) attribute_hidden; ++weak_alias (__weakstub, _locale_init) + #endif + #ifdef __UCLIBC_HAS_THREADS__ + extern void weak_function __pthread_initialize_minimal(void); ++weak_alias (__weakstub, __pthread_initialize_minimal) + #endif + + /* If __UCLIBC_FORMAT_SHARED_FLAT__, all array initialisation and finalisation +@@ -198,8 +202,7 @@ + * __pthread_initialize_minimal so we can use pthread_locks + * whenever they are needed. + */ +- if (likely(__pthread_initialize_minimal!=NULL)) +- __pthread_initialize_minimal(); ++ __pthread_initialize_minimal(); + #endif + + #ifndef SHARED +@@ -222,8 +225,7 @@ + + #ifdef __UCLIBC_HAS_LOCALE__ + /* Initialize the global locale structure. */ +- if (likely(_locale_init!=NULL)) +- _locale_init(); ++ _locale_init(); + #endif + + /* +@@ -232,8 +234,7 @@ + * Thus we get a nice size savings because the stdio functions + * won't be pulled into the final static binary unless used. + */ +- if (likely(_stdio_init != NULL)) +- _stdio_init(); ++ _stdio_init(); + + } + libc_hidden_def(__uClibc_init) +diff -ru uClibc-0.9.29-old/libc/stdlib/_atexit.c uClibc-0.9.29/libc/stdlib/_atexit.c +--- uClibc-0.9.29-old/libc/stdlib/_atexit.c 2007-05-04 09:13:17.000000000 -0500 ++++ uClibc-0.9.29/libc/stdlib/_atexit.c 2007-09-15 07:14:47.000000000 -0500 +@@ -306,6 +306,8 @@ + + #ifdef L_exit + extern void weak_function _stdio_term(void) attribute_hidden; ++static void __weakstub (void) { return; } ++weak_alias (__weakstub, _stdio_term) + attribute_hidden void (*__exit_cleanup) (int) = 0; + __UCLIBC_MUTEX_INIT(__atexit_lock, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP); + +@@ -330,8 +332,7 @@ + * this will attempt to commit all buffered writes. It may also + * unbuffer all writable files, or close them outright. + * Check the stdio routines for details. */ +- if (_stdio_term) +- _stdio_term(); ++ _stdio_term(); + + _exit(rv); + }