Author: ps-guest
Date: 2006-02-27 09:28:09 +0000 (Mon, 27 Feb 2006)
New Revision: 1254

Added:
   trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/dl-machine.h
   trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/elf/
   trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/elf/start.S
Removed:
   trunk/glibc-2.3-head/patches/hacks/
Log:
FreeBSD/amd64 uses slightly different _startup calling convention (compared to 
Linux/amd64)



Added: 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-27 
09:27:58 UTC (rev 1253)
+++ trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/dl-machine.h   2006-02-27 
09:28:09 UTC (rev 1254)
@@ -0,0 +1,76 @@
+/* Machine-dependent ELF dynamic relocation inline functions.  FreeBSD/amd64 
version.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Petr Salinger, 2006.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef dl_machine_h
+#include_next <dl_machine_h>
+
+#undef RTLD_START
+
+/* Initial entry point code for the dynamic linker.
+   The C function `_dl_start' is the real entry point;
+   its return value is the user program's entry point.  */
+#define RTLD_START asm ("\n\
+.text\n\
+       .align 16\n\
+.globl _start\n\
+# we dont use it: .globl _dl_start_user\n\
+_start:\n\
+       # align stack.\n\
+       andq $-16, %rsp\n\
+       # save argument pointer.\n\
+       movq %rdi, %r13\n\
+       call _dl_start\n\
+# we dont use it: _dl_start_user:\n\
+       # Save the user entry point address in %r12.\n\
+       movq %rax, %r12\n\
+       # See if we were run as a command with the executable file\n\
+       # name as an extra leading argument.\n\
+       movl _dl_skip_args(%rip), %eax\n\
+       # get the original argument count.\n\
+       movq 0(%r13), %rdx\n\
+       # Adjust the pointer to skip _dl_skip_args words.\n\
+       leaq (%r13,%rax,8), %r13\n\
+       # Subtract _dl_skip_args from argc.\n\
+       subl %eax, %edx\n\
+       # Put argc on adjusted place\n\
+       movq %rdx, 0(%r13)\n\
+       # Call _dl_init (struct link_map *main_map, int argc, char **argv, char 
**env)\n\
+       # argc -> rsi\n\
+       movq %rdx, %rsi\n\
+       # _dl_loaded -> rdi\n\
+       movq _rtld_local(%rip), %rdi\n\
+       # env -> rcx\n\
+       leaq 16(%r13,%rdx,8), %rcx\n\
+       # argv -> rdx\n\
+       leaq 8(%r13), %rdx\n\
+       # Clear %rbp to mark outermost frame obviously even for constructors.\n\
+       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\
+       leaq _dl_fini(%rip), %rdx\n\
+       # And make sure %rdi points to argc stored on the stack.\n\
+       movq %r13, %rdi\n\
+       # Jump to the user's entry point.\n\
+       jmp *%r12\n\
+.previous\n\
+");
+
+#endif

Added: 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-27 
09:27:58 UTC (rev 1253)
+++ trunk/glibc-2.3-head/sysdeps/kfreebsd/x86_64/elf/start.S    2006-02-27 
09:28:09 UTC (rev 1254)
@@ -0,0 +1,132 @@
+/* Startup code for FreeBSD/amd64 ABI.
+   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Jaeger <[EMAIL PROTECTED]>, 2001.
+   FreeBSD modification by Petr Salinger, 2006.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file. (The GNU Lesser General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+/* 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:
+
+   %rdx                Contains a function pointer to be registered with 
`atexit'.
+               This is how the dynamic linker arranges to have DT_FINI
+               functions called for shared libraries that have been loaded
+               before this code runs.
+
+   %rsp                The stack contains the arguments and environment:
+               0(%rsp)                 argc
+               8(%rsp)                 argv[0]
+               ...
+               (8*argc)(%rsp)          NULL
+               (8*(argc+1))(%rsp)      envp[0]
+               ...
+                                       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 
+*/
+
+#include "bp-sym.h"
+
+       .text
+       .globl _start
+       .type _start,@function
+_start:
+       /* Clear the frame pointer.  The ABI suggests this be done, to mark
+          the outermost frame obviously.  */
+       xorl %ebp, %ebp         /* zero extending clears whole rbp */
+
+       /* Extract the arguments as encoded on the stack and set up
+          the arguments for __libc_start_main (int (*main) (int, char **, char 
**),
+                  int argc, char *argv,
+                  void (*init) (void), void (*fini) (void),
+                  void (*rtld_fini) (void), void *stack_end).
+          The arguments are passed via registers and on the stack:
+       main:           %rdi
+       argc:           %rsi
+       argv:           %rdx
+       init:           %rcx
+       fini:           %r8
+       rtld_fini:      %r9
+       stack_end:      stack.  */
+
+       movq %rdx, %r9          /* Address of the shared library termination
+                                  function.  */
+       movq 0(%rdi), %rsi      /* argument count.  */
+       leaq 8(%rdi), %rdx      /* argv starts just at above argc.  */
+
+       /* Align the stack to a 16 byte boundary to follow the ABI.  */
+       andq  $~15, %rsp
+
+       pushq %rax              /* Push garbage because we push 8 more bytes.  
*/
+
+       /* Provide the highest stack address to the user code (for stacks
+          which grow downwards).  */
+       pushq %rsp
+
+#ifdef SHARED
+       /* Pass address of our own entry points to .fini and .init.  */
+       movq [EMAIL PROTECTED](%rip), %r8
+       movq [EMAIL PROTECTED](%rip), %rcx
+
+       movq BP_SYM (main)@GOTPCREL(%rip), %rdi
+
+       /* Call the user's main function, and exit with its value.
+          But let the libc call main.    */
+       call BP_SYM (__libc_start_main)@PLT
+#else
+       /* Pass address of our own entry points to .fini and .init.  */
+       movq $__libc_csu_fini, %r8
+       movq $__libc_csu_init, %rcx
+
+       movq $BP_SYM (main), %rdi
+
+       /* Call the user's main function, and exit with its value.
+          But let the libc call main.    */
+       call BP_SYM (__libc_start_main)
+#endif
+
+       hlt                     /* Crash if somehow `exit' does return.  */
+
+/* Define a symbol for the first piece of initialized data.  */
+       .data
+       .globl __data_start
+__data_start:
+       .long 0
+       .weak data_start
+       data_start = __data_start


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to