mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 20:48:29 +01:00
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.
This commit is contained in:
parent
73d310e1d2
commit
41d518360f
4 changed files with 24 additions and 8 deletions
6
Makefile
6
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
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include "libc.h"
|
||||
|
||||
#ifdef __PIC__
|
||||
#ifdef USE_LIBC_ACCESSOR
|
||||
struct __libc *__libc_loc()
|
||||
{
|
||||
static struct __libc __libc;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
8
src/ldso/start.c
Normal file
8
src/ldso/start.c
Normal file
|
@ -0,0 +1,8 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
/* stub for archs that lack dynamic linker support */
|
||||
|
||||
void _start()
|
||||
{
|
||||
_Exit(1);
|
||||
}
|
Loading…
Add table
Reference in a new issue