various changes in preparation for dynamic linking support
authorRich Felker <dalias@aerifal.cx>
Thu, 24 Feb 2011 21:37:21 +0000 (16:37 -0500)
committerRich Felker <dalias@aerifal.cx>
Thu, 24 Feb 2011 21:37:21 +0000 (16:37 -0500)
prefer using visibility=hidden for __libc internal data, rather than
an accessor function, if the compiler has visibility.

optimize with -O3 for PIC targets (shared library). without heavy
inlining, reloading the GOT register in small functions kills
performance. 20-30% size increase for a single libc.so is not a big
deal, compared to comparaible size increase in every static binaries.

use -Bsymbolic-functions, not -Bsymbolic. global variables are subject
to COPY relocations, and thus binding their addresses in the library
at link time will cause library functions to read the wrong (original)
copies instead of the copies made in the main program's bss section.

add entry point, _start, for dynamic linker.

Makefile
src/internal/libc.c
src/internal/libc.h
src/ldso/start.c [new file with mode: 0644]

index a47439b87daff338d28685d89987e7d248ae5469..5c17642310538fb1987955a323716347c769d1ee 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -21,16 +21,16 @@ LOBJS = $(OBJS:.o=.lo)
 GENH = include/bits/alltypes.h
 
 CFLAGS  = -Os -nostdinc -ffreestanding -std=c99 -D_XOPEN_SOURCE=700 -pipe
-LDFLAGS = -nostdlib -shared -Wl,-Bsymbolic
+LDFLAGS = -nostdlib -shared -fPIC -Wl,-e,_start -Wl,-Bsymbolic-functions
 INC     = -I./include -I./src/internal -I./arch/$(ARCH)
-PIC     = -fPIC
+PIC     = -fPIC -O3
 AR      = $(CROSS_COMPILE)ar
 RANLIB  = $(CROSS_COMPILE)ranlib
 OBJCOPY = $(CROSS_COMPILE)objcopy
 
 ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH))
 
-EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv
+EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
 EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
 CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o
 LIBC_LIBS = lib/libc.a
index 954efedf8b04eee03e09d26b36563097ef2c65db..5f12e29588cf1cccba4f8e967c7fe7927b14e3c3 100644 (file)
@@ -1,6 +1,6 @@
 #include "libc.h"
 
-#ifdef __PIC__
+#ifdef USE_LIBC_ACCESSOR
 struct __libc *__libc_loc()
 {
        static struct __libc __libc;
index 8a84be0b90f144ccc661921c1e1553f7119d72fe..e81ef7609f466d4dc2fa1b068acbc7cb87d9eaa6 100644 (file)
@@ -17,12 +17,20 @@ struct __libc {
        void (*fork_handler)(int);
 };
 
-#ifdef __PIC__
-extern struct __libc *__libc_loc(void) __attribute__((const));
-#define libc (*__libc_loc())
-#else
+
+#if 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
+extern struct __libc __libc __attribute__((visibility("hidden")));
+#define libc __libc
+
+#elif !defined(__PIC__)
 extern struct __libc __libc;
 #define libc __libc
+
+#else
+#define USE_LIBC_ACCESSOR
+extern struct __libc *__libc_loc(void) __attribute__((const));
+#define libc (*__libc_loc())
+
 #endif
 
 
diff --git a/src/ldso/start.c b/src/ldso/start.c
new file mode 100644 (file)
index 0000000..f6ae7cd
--- /dev/null
@@ -0,0 +1,8 @@
+#include <stdlib.h>
+
+/* stub for archs that lack dynamic linker support */
+
+void _start()
+{
+       _Exit(1);
+}