From c0008412eb2f37042adc360577fe8f234b3c095f Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Mon, 3 Dec 2007 23:10:14 +0000 Subject: Blackfin FD-PIC patches 5/6. A couple more target macros for ld.so to deal with FD-PIC support. We need special code to compute the initial got and dpnt, and we need to pass extra arguments to _dl_get_ready_to_run. --- ldso/include/dl-defs.h | 14 ++++++++++++++ ldso/include/ldso.h | 10 +++++++++- ldso/ldso/dl-startup.c | 10 +++++++--- ldso/ldso/ldso.c | 9 +++++---- 4 files changed, 35 insertions(+), 8 deletions(-) (limited to 'ldso') diff --git a/ldso/include/dl-defs.h b/ldso/include/dl-defs.h index 21a66a40f..3de7f5230 100644 --- a/ldso/include/dl-defs.h +++ b/ldso/include/dl-defs.h @@ -95,6 +95,20 @@ typedef struct { ((LOADADDR) + (ADDR)) #endif +/* Initialize the location of the dynamic addr. This is only called + * from DL_START, so additional arguments passed to it may be referenced. */ +#ifndef DL_BOOT_COMPUTE_DYN +#define DL_BOOT_COMPUTE_DYN(DPNT, GOT, LOAD_ADDR) \ + ((DPNT) = ((ElfW(Dyn) *) DL_RELOC_ADDR(load_addr, got))) +#endif + +/* Initialize the location of the global offset table. This is only called + * from DL_START, so additional arguments passed to it may be referenced. */ +#ifndef DL_BOOT_COMPUTE_GOT +#define DL_BOOT_COMPUTE_GOT(GOT) \ + ((GOT) = elf_machine_dynamic()) +#endif + /* Initialize a LOADADDR representing the loader itself. It's only * called from DL_BOOT, so additional arguments passed to it may be * referenced. diff --git a/ldso/include/ldso.h b/ldso/include/ldso.h index 88c1116e7..178af0e64 100644 --- a/ldso/include/ldso.h +++ b/ldso/include/ldso.h @@ -106,7 +106,15 @@ extern void _dl_unsetenv(const char *symbol, char **envp); extern char *_dl_strdup(const char *string); extern void _dl_dprintf(int, const char *, ...); +#ifndef DL_GET_READY_TO_RUN_EXTRA_PARMS +# define DL_GET_READY_TO_RUN_EXTRA_PARMS +#endif +#ifndef DL_GET_READY_TO_RUN_EXTRA_ARGS +# define DL_GET_READY_TO_RUN_EXTRA_ARGS +#endif + extern void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv); + ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv + DL_GET_READY_TO_RUN_EXTRA_PARMS); #endif /* _LDSO_H_ */ diff --git a/ldso/ldso/dl-startup.c b/ldso/ldso/dl-startup.c index d4294ec3a..bdb170ed8 100644 --- a/ldso/ldso/dl-startup.c +++ b/ldso/ldso/dl-startup.c @@ -192,8 +192,11 @@ DL_START(unsigned long args) * we can take advantage of the magic offset register, if we * happen to know what that is for this architecture. If not, * we can always read stuff out of the ELF file to find it... */ - got = elf_machine_dynamic(); - dpnt = (ElfW(Dyn) *) DL_RELOC_ADDR(load_addr, got); + DL_BOOT_COMPUTE_GOT(got); + + /* Now, finally, fix up the location of the dynamic stuff */ + DL_BOOT_COMPUTE_DYN (dpnt, got, load_addr); + SEND_EARLY_STDERR_DEBUG("First Dynamic section entry="); SEND_ADDRESS_STDERR_DEBUG(dpnt, 1); _dl_memset(tpnt, 0, sizeof(struct elf_resolve)); @@ -304,7 +307,8 @@ DL_START(unsigned long args) __rtld_stack_end = (void *)(argv - 1); - _dl_get_ready_to_run(tpnt, load_addr, auxvt, envp, argv); + _dl_get_ready_to_run(tpnt, load_addr, auxvt, envp, argv + DL_GET_READY_TO_RUN_EXTRA_ARGS); /* Transfer control to the application. */ diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 3b3983b85..31185fd3c 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -131,8 +131,9 @@ static void __attribute__ ((destructor)) __attribute_used__ _dl_fini(void) } void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, - char **argv) + ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, + char **argv + DL_GET_READY_TO_RUN_EXTRA_PARMS) { ElfW(Phdr) *ppnt; ElfW(Dyn) *dpnt; @@ -313,7 +314,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, /* OK, we have what we need - slip this one into the list. */ app_tpnt = _dl_add_elf_hash_table(_dl_progname, app_tpnt->loadaddr, app_tpnt->dynamic_info, - DL_RELOC_ADDR(app_tpnt->loadaddr, ppnt->p_vaddr), + (unsigned long) DL_RELOC_ADDR(app_tpnt->loadaddr, ppnt->p_vaddr), ppnt->p_filesz); _dl_loaded_modules->libtype = elf_executable; _dl_loaded_modules->ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_val; @@ -345,7 +346,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, if (ptmp != _dl_ldsopath) *ptmp = '\0'; - _dl_debug_early("Lib Loader: (%x) %s\n", DL_LOADADDR_BASE(tpnt->loadaddr), tpnt->libname); + _dl_debug_early("Lib Loader: (%x) %s\n", (unsigned) DL_LOADADDR_BASE(tpnt->loadaddr), tpnt->libname); } } app_tpnt->relro_addr = relro_addr; -- cgit v1.2.3