Author: ps-guest Date: 2006-02-28 20:21:50 +0000 (Tue, 28 Feb 2006) New Revision: 1278
Modified: trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/dl-machine.h trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/elf/start.S Log: * yet another change for _startup calling convention now also static binaries should work fine Modified: trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/dl-machine.h =================================================================== --- trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/dl-machine.h 2006-02-28 17:32:32 UTC (rev 1277) +++ trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/dl-machine.h 2006-02-28 20:21:50 UTC (rev 1278) @@ -66,10 +66,12 @@ xorl %ebp, %ebp\n\ # Call the function to run the initializers.\n\ call [EMAIL PROTECTED] - # Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\ + # Pass our finalizer function to the user in %rdx, as per ELF ABI draft.\n\ leaq _dl_fini(%rip), %rdx\n\ # And make sure %rdi points to argc stored on the stack.\n\ movq %r13, %rdi\n\ + # Pass finalizer function also in %rsi, as per C calling convention.\n\ + movq %rdx, %rsi\n\ # Jump to the user's entry point.\n\ jmp *%r12\n\ .previous\n\ Modified: trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/elf/start.S =================================================================== --- trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/elf/start.S 2006-02-28 17:32:32 UTC (rev 1277) +++ trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/elf/start.S 2006-02-28 20:21:50 UTC (rev 1278) @@ -39,7 +39,7 @@ /* This is the canonical entry point, usually the first thing in the text segment. The SVR4/i386 ABI (pages 3-31, 3-32) says that when the entry point runs, most registers' values are unspecified, except for a few. - Applied on amd64: + Blindly applied on amd64: %rdx Contains a function pointer to be registered with `atexit'. This is how the dynamic linker arranges to have DT_FINI @@ -55,10 +55,21 @@ ... NULL - On amd64 %rsp also have to be 16-byte aligned, - FreeBSD decided to use %edi as pointer to stack and align %rsp, - therefore on entry from system, %rsp=%rdi or %rsp=%rdi-8. - on entry from ld.so glibc might set up it slightly differently + But on amd64 %rsp also have to be 16-byte aligned, + standard C calling convention already passes arguments in registers. + + FreeBSD uses %edi as pointer to arguments and environment, %rsp is passed aligned. + On entry from kernel, %rsp=%rdi or %rsp=%rdi-8, + on entry from ld.so, glibc might set up it slightly differently. + + On FreeBSD, we use %rsi for passing function pointer to rtld_fini(). + On entry from FreeBSD kernel, %rsi is cleared, %rdx is not cleared, + on entry from ld.so, glibc sets both %rsi and %rdx to point to rtld_fini(). + + Used interface (via %rdi, %rsi) is equal to standard C calling interface for + + void _start(void *arg, void *rtld_fini()); + */ #include "bp-sym.h" @@ -85,7 +96,7 @@ rtld_fini: %r9 stack_end: stack. */ - movq %rdx, %r9 /* Address of the shared library termination + movq %rsi, %r9 /* Address of the shared library termination function. */ movq 0(%rdi), %rsi /* argument count. */ leaq 8(%rdi), %rdx /* argv starts just at above argc. */ -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]