[PATCH] ldso: fix standalone execution on x86_64 architecture

Filippo Arcidiacono filippo.arcidiacono at st.com
Thu Mar 27 07:59:22 UTC 2014


Good catch.
Thanks to have fixed it.

On 3/26/2014 2:31 PM, cedric.vincent at st.com wrote:
> If the dynamic linker is built with LDSO_STANDALONE_SUPPORT=y, it can
> load then run a dynamically linked program when explicitly invoked
> from the command line.  This is used for test and prelink purposes,
> and also by other tools like PRoot to force the kernel to load the
> right ELF interpreter.
>
> This feature is currently broken on x86_64 since the number of command
> line arguments (ie. argc) passed from the kernel is an "elf_addr_t"
> (64 bit on x86_64), whereas it is read as an "unsigned int" (32 bit on
> x86_64).
>
> Ref: https://github.com/cedric-vincent/PRoot/issues/45
> Signed-off-by: Cédric VINCENT <cedric.vincent at st.com>
> ---
>   ldso/ldso/ldso.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
> index becabd3..89a0126 100644
> --- a/ldso/ldso/ldso.c
> +++ b/ldso/ldso/ldso.c
> @@ -526,8 +526,8 @@ void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
>   
>   #ifdef __LDSO_STANDALONE_SUPPORT__
>   	if (_start == (void *) auxvt[AT_ENTRY].a_un.a_val) {
> -		unsigned int *aux_dat = (unsigned int *) argv;
> -		int argc = aux_dat[-1];
> +		unsigned long *aux_dat = (unsigned long *) argv;
> +		long argc = aux_dat[-1];
>   
>   		tpnt->libname = argv[0];
>   		while (argc > 1)



More information about the uClibc mailing list