提交 41d51836 编写于 作者: R Rich Felker

various changes in preparation for dynamic linking support

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.
上级 73d310e1
...@@ -21,16 +21,16 @@ LOBJS = $(OBJS:.o=.lo) ...@@ -21,16 +21,16 @@ LOBJS = $(OBJS:.o=.lo)
GENH = include/bits/alltypes.h GENH = include/bits/alltypes.h
CFLAGS = -Os -nostdinc -ffreestanding -std=c99 -D_XOPEN_SOURCE=700 -pipe 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) INC = -I./include -I./src/internal -I./arch/$(ARCH)
PIC = -fPIC PIC = -fPIC -O3
AR = $(CROSS_COMPILE)ar AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlib RANLIB = $(CROSS_COMPILE)ranlib
OBJCOPY = $(CROSS_COMPILE)objcopy OBJCOPY = $(CROSS_COMPILE)objcopy
ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH)) 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) EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o
LIBC_LIBS = lib/libc.a LIBC_LIBS = lib/libc.a
......
#include "libc.h" #include "libc.h"
#ifdef __PIC__ #ifdef USE_LIBC_ACCESSOR
struct __libc *__libc_loc() struct __libc *__libc_loc()
{ {
static struct __libc __libc; static struct __libc __libc;
......
...@@ -17,12 +17,20 @@ struct __libc { ...@@ -17,12 +17,20 @@ struct __libc {
void (*fork_handler)(int); void (*fork_handler)(int);
}; };
#ifdef __PIC__
extern struct __libc *__libc_loc(void) __attribute__((const)); #if 100*__GNUC__+__GNUC_MINOR__ >= 303 || defined(__PCC__) || defined(__TINYC__)
#define libc (*__libc_loc()) extern struct __libc __libc __attribute__((visibility("hidden")));
#else #define libc __libc
#elif !defined(__PIC__)
extern struct __libc __libc; extern struct __libc __libc;
#define libc __libc #define libc __libc
#else
#define USE_LIBC_ACCESSOR
extern struct __libc *__libc_loc(void) __attribute__((const));
#define libc (*__libc_loc())
#endif #endif
......
#include <stdlib.h>
/* stub for archs that lack dynamic linker support */
void _start()
{
_Exit(1);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册