about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--src/internal/libc.c2
-rw-r--r--src/internal/libc.h16
-rw-r--r--src/ldso/start.c8
4 files changed, 24 insertions, 8 deletions
diff --git a/Makefile b/Makefile
index a47439b8..5c176423 100644
--- 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
diff --git a/src/internal/libc.c b/src/internal/libc.c
index 954efedf..5f12e295 100644
--- a/src/internal/libc.c
+++ b/src/internal/libc.c
@@ -1,6 +1,6 @@
 #include "libc.h"
 
-#ifdef __PIC__
+#ifdef USE_LIBC_ACCESSOR
 struct __libc *__libc_loc()
 {
 	static struct __libc __libc;
diff --git a/src/internal/libc.h b/src/internal/libc.h
index 8a84be0b..e81ef760 100644
--- a/src/internal/libc.h
+++ b/src/internal/libc.h
@@ -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
index 00000000..f6ae7cd2
--- /dev/null
+++ b/src/ldso/start.c
@@ -0,0 +1,8 @@
+#include <stdlib.h>
+
+/* stub for archs that lack dynamic linker support */
+
+void _start()
+{
+	_Exit(1);
+}