From 768b82c6de24e480267c4c251c440edfc71800e3 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 25 May 2015 19:15:17 -0400 Subject: move call to dynamic linker stage-3 into stage-2 function this move eliminates a duplicate "by-hand" symbol lookup loop from the stage-1 code and replaces it with a call to find_sym, which can be used once we're in stage 2. it reduces the size of the stage 1 code, which is helpful because stage 1 will become the crt start file for static-PIE executables, and it will allow stage 3 to access stage 2's automatic storage, which will be important in an upcoming commit. --- src/ldso/dynlink.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/ldso/dynlink.c') diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 93595a0f..3842aeba 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -1116,7 +1116,7 @@ static void update_tls_size() * linker itself, but some of the relocations performed may need to be * replaced later due to copy relocations in the main program. */ -void __dls2(unsigned char *base) +void __dls2(unsigned char *base, size_t *sp) { Ehdr *ehdr = (void *)base; ldso.base = base; @@ -1134,6 +1134,12 @@ void __dls2(unsigned char *base) ldso.relocated = 0; ldso.rel_update_got = 1; + + /* Call dynamic linker stage-3, __dls3, looking it up + * symbolically as a barrier against moving the address + * load across the above relocation processing. */ + struct symdef dls3_def = find_sym(&ldso, "__dls3", 0); + ((stage3_func)(ldso.base+dls3_def.sym->st_value))(sp); } /* Stage 3 of the dynamic linker is called with the dynamic linker/libc -- cgit v1.2.1