diff --git a/ChangeLog b/ChangeLog index da9aac7682..605363bd0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ +2000-11-15 Jakub Jelinek + + * dlfcn/default.c (main): Add test for dladdr of main returning + argv[0] in dli_fname field. + +2000-11-15 Jakub Jelinek + + * Makeconfig (run-program-prefix): Move test-static test into the + variable. + + * sysdeps/alpha/dl-machine.h (RTLD_START): Update _dl_argv. + * sysdeps/sparc/sparc32/dl-machine.h (RTLD_START): Likewise, + schedule instructions. + * sysdeps/sparc/sparc64/dl-machine.h (RTLD_START): Likewise, + schedule instructions, fix a bug in copying auxiliary data. + 2000-11-15 Ulrich Drepper + * manual/startup.texi (Program Arguments): Fix type of main's envp + parameter. + Reported by Raúl Núñez de Arenas Coronado . + * iconvdata/gconv-modules: Add CP950 alias. 2000-11-13 Jakub Jelinek diff --git a/Makeconfig b/Makeconfig index 3a5bf3eb41..b706e9a5ad 100644 --- a/Makeconfig +++ b/Makeconfig @@ -495,12 +495,9 @@ sysdep-library-path = \ $(subst $(empty) ,:,$(strip $(patsubst -Wl$(comma)-rpath-link=%, %,\ $(filter -Wl$(comma)-rpath-link=%,\ $(sysdep-LDFLAGS))))) -ifeq (,$(findstring $(notdir $(built-program-file)), $(tests-static))) -run-program-prefix = $(elf-objpfx)$(rtld-installed-name) \ - --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) -else -run-program-prefix = -endif +run-program-prefix = $(if $(findstring $(notdir $(built-program-file)), $(tests-static)),, \ + $(elf-objpfx)$(rtld-installed-name) \ + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path))) else run-program-prefix = endif diff --git a/dlfcn/default.c b/dlfcn/default.c index 98c0b2a9b6..e5d5275ff5 100644 --- a/dlfcn/default.c +++ b/dlfcn/default.c @@ -1,5 +1,6 @@ #include #include +#include extern int test_in_mod1 (void *); @@ -12,7 +13,22 @@ main (int argc, char *argv[]) int (*ifp) (void); void *p; int result = 0; - + Dl_info info; + + dladdr(main, &info); + if (info.dli_fname == NULL) + { + printf ("%s: dladdr returns NULL dli_fname\n", __FILE__); + result = 1; + } + else if (strcmp (info.dli_fname, argv[0])) + { + printf ("%s: dladdr returned '%s' as dli_fname\n", __FILE__, info.dli_fname); + result = 1; + } + else + printf ("%s: dladdr returned correct dli_fname\n", __FILE__); + /* Find function `main'. */ p = dlsym (RTLD_DEFAULT, "main"); if (p == NULL) diff --git a/manual/startup.texi b/manual/startup.texi index 50649c9197..526d19d639 100644 --- a/manual/startup.texi +++ b/manual/startup.texi @@ -86,7 +86,7 @@ three elements, @code{"cat"}, @code{"foo"} and @code{"bar"}. In Unix systems you can define @code{main} a third way, using three arguments: @smallexample -int main (int @var{argc}, char *@var{argv}[], char *@var{envp}) +int main (int @var{argc}, char *@var{argv}[], char *@var{envp}[]) @end smallexample The first two arguments are just the same. The third argument diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h index d9aeb18764..73c6cbde19 100644 --- a/sysdeps/alpha/dl-machine.h +++ b/sysdeps/alpha/dl-machine.h @@ -314,10 +314,14 @@ $fixup_stack: involves copying everything down, since the stack pointer must always be 16-byte aligned. */ ldq $2, 0($sp) + ldq $5, _dl_argv + subq $31, $1, $6 subq $2, $1, $2 + s8addq $6, $5, $5 mov $sp, $4 s8addq $1, $sp, $3 stq $2, 0($sp) + stq $5, _dl_argv /* Copy down argv. */ 0: ldq $5, 8($3) addq $4, 8, $4 diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h index c1d423aa36..84d25cd10a 100644 --- a/sysdeps/sparc/sparc32/dl-machine.h +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -224,23 +224,29 @@ _dl_start_user: sethi %hi(__libc_stack_end), %g2 or %g2, %lo(__libc_stack_end), %g2 ld [%l7 + %g2], %l1 + sethi %hi(_dl_skip_args), %g2 add %sp, 6*4, %l2 + or %g2, %lo(_dl_skip_args), %g2 st %l2, [%l1] /* See if we were run as a command with the executable file name as an extra leading argument. If so, adjust the contents of the stack. */ - sethi %hi(_dl_skip_args), %g2 - or %g2, %lo(_dl_skip_args), %g2 ld [%l7+%g2], %i0 ld [%i0], %i0 tst %i0 beq 3f ld [%sp+22*4], %i5 /* load argc */ /* Find out how far to shift. */ + sethi %hi(_dl_argv), %l3 + or %l3, %lo(_dl_argv), %l3 + ld [%l7+%l3], %l3 sub %i5, %i0, %i5 + ld [%l3], %l4 sll %i0, 2, %i2 st %i5, [%sp+22*4] + sub %l4, %i2, %l4 add %sp, 23*4, %i1 add %i1, %i2, %i2 + st %l4, [%l3] /* Copy down argv */ 21: ld [%i2], %i3 add %i2, 4, %i2 diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h index 079e1d7530..b2a0e7a0e9 100644 --- a/sysdeps/sparc/sparc64/dl-machine.h +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -544,38 +544,43 @@ _start: _dl_start_user: /* Load the GOT register. */ 1: call 11f - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 -11: or %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 - add %l7,%o7,%l7 - /* Save the user entry point address in %l0. */ - mov %o0,%l0 + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 /* Store the highest stack address. */ sethi %hi(__libc_stack_end), %g5 + add %l7, %o7, %l7 or %g5, %lo(__libc_stack_end), %g5 + /* Save the user entry point address in %l0. */ + mov %o0, %l0 ldx [%l7 + %g5], %l1 + sethi %hi(_dl_skip_args), %g5 add %sp, 6*8, %l2 - stx %l2, [%l1] /* See if we were run as a command with the executable file name as an extra leading argument. If so, we must shift things around since we must keep the stack doubleword aligned. */ - sethi %hi(_dl_skip_args), %g5 or %g5, %lo(_dl_skip_args), %g5 - ldx [%l7+%g5], %i0 + stx %l2, [%l1] + ldx [%l7 + %g5], %i0 ld [%i0], %i0 brz,pt %i0, 2f - ldx [%sp+" __S(STACK_BIAS) "+22*8], %i5 + ldx [%sp + " __S(STACK_BIAS) " + 22*8], %i5 /* Find out how far to shift. */ + sethi %hi(_dl_argv), %l4 sub %i5, %i0, %i5 - sllx %i0, 3, %i2 - stx %i5, [%sp+" __S(STACK_BIAS) "+22*8] - add %sp, " __S(STACK_BIAS) "+23*8, %i1 - add %i1, %i2, %i2 + or %l4, %lo(_dl_argv), %l4 + sllx %i0, 3, %l6 + ldx [%l7 + %l4], %l4 + stx %i5, [%sp + " __S(STACK_BIAS) " + 22*8] + add %sp, " __S(STACK_BIAS) " + 23*8, %i1 + add %i1, %l6, %i2 + ldx [%l4], %l5 /* Copy down argv. */ 12: ldx [%i2], %i3 add %i2, 8, %i2 stx %i3, [%i1] brnz,pt %i3, 12b add %i1, 8, %i1 + sub %l5, %l6, %l5 /* Copy down envp. */ 13: ldx [%i2], %i3 add %i2, 8, %i2 @@ -584,18 +589,19 @@ _dl_start_user: add %i1, 8, %i1 /* Copy down auxiliary table. */ 14: ldx [%i2], %i3 - ldx [%i2+8], %i4 + ldx [%i2 + 8], %i4 add %i2, 16, %i2 stx %i3, [%i1] - stx %i4, [%i1+8] - brnz,pt %i3, 13b + stx %i4, [%i1 + 8] + brnz,pt %i3, 14b add %i1, 16, %i1 + stx %l5, [%l4] /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp. */ 2: sethi %hi(_dl_loaded), %o0 - add %sp, " __S(STACK_BIAS) "+23*8, %o2 + add %sp, " __S(STACK_BIAS) " + 23*8, %o2 orcc %o0, %lo(_dl_loaded), %o0 sllx %i5, 3, %o3 - ldx [%l7+%o0], %o0 + ldx [%l7 + %o0], %o0 add %o3, 8, %o3 mov %i5, %o1 add %o2, %o3, %o3 @@ -604,7 +610,7 @@ _dl_start_user: /* Pass our finalizer function to the user in %g1. */ sethi %hi(_dl_fini), %g1 or %g1, %lo(_dl_fini), %g1 - ldx [%l7+%g1], %g1 + ldx [%l7 + %g1], %g1 /* Jump to the user's entry point and deallocate the extra stack we got. */ jmp %l0 add %sp, 6*8, %sp