r1254 - in trunk/glibc-2.3-head: patches sysdeps/kfreebsd/x86_64 sysdeps/kfreebsd/x86_64/elf
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 _dl_init_internal@PLT\n\
+ # 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 <aj@suse.de>, 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 __libc_csu_fini@GOTPCREL(%rip), %r8
+ movq __libc_csu_init@GOTPCREL(%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
Reply to: