Hi Rich, Thanks I am able to get my dynamic linker loaded into memory but facing issue during application load at __dls3 function. I am getting following print from MUSL - "musl libc Version 1.1.10 Dynamic Program Loader Usage: hello.elf [options] [--] pathname--2--" Not sure why my application is not getting loaded in below code __dls3 function ? char *ldname = argv[0]; size_t l = strlen(ldname); *ldname is the application elf which I want to load "hello.elf"* if (l >= 3 && !strcmp(ldname+l-3, "ldd")) ldd_mode = 1; *I am not sure why "ldd" string is compared here ?* argv++; *I don't pass any options ? Do I need to pass some option value ?* while (argv[0] && argv[0][0]=='-' && argv[0][1]=='-') { char *opt = argv[0]+2; *argv++ = (void *)-1; if (!*opt) { break; } else if (!memcmp(opt, "list", 5)) { ldd_mode = 1; } else if (!memcmp(opt, "library-path", 12)) { if (opt[12]=='=') env_path = opt+13; else if (opt[12]) *argv = 0; else if (*argv) env_path = *argv++; } else if (!memcmp(opt, "preload", 7)) { if (opt[7]=='=') env_preload = opt+8; else if (opt[7]) *argv = 0; else if (*argv) env_preload = *argv++; } else { argv[0] = 0; } } *I see the argv[0] is set to 0 so I am not able to see my application loaded ?* Thanks, NJ On Tue, Jan 5, 2016 at 1:23 PM, Rich Felker wrote: > On Tue, Jan 05, 2016 at 01:00:37PM -0500, N Jain wrote: > > > You never answered whether > > > you were setting up the aux vector right, but if not, that's > > > definitely going to cause problems. > > > > I am not setting any aux vectors. I only pass argv = "app.elf" and argc > = 1 > > to dynamic linker. > > What and where I need to set "aux" vectors ? Any pointers will help.. > > The ELF entry point ABI is that the initial stack pointer points to an > array of word-sized cells containing: > > argc argv[0] argv[1] ... argv[argc-1] argv[argc](=0) anviron[0] > environ[1] ... 0 auxv[0].key auxv[0].val auxv[1].key auxv[1].val ... 0 > > The auxv items are key,val pairs where the key is one of the AT_* > constants from elf.h and the value is either an integer or pointer > (depending on which key it's for). At the very least you should be > passing: > > AT_PHDR - points to the start of elf program headers > AT_PHENT - size of each program header > AT_PHNUM - number of program headers > > If you load both the main program and "interpreter" (dynamic linker) > from the kernel, then these values should be for the main program's > headers, and in addition you need to pass: > > AT_BASE - load address of the "interpreter" (dynamic linker) > AT_ENTRY - entry point address of the main program, from its header > > On the other hand, if you only load the dynamic linker (treating it as > the main program), then the program header auxv entries should hold > the right values for the dynamic linker. > > Rich >