[Glibc-bsd-commits] r4765 - in trunk/glibc-ports/kfreebsd: i386 x86_64
Petr Salinger
ps-guest at alioth.debian.org
Thu Jul 18 15:50:41 UTC 2013
Author: ps-guest
Date: 2013-07-18 15:50:40 +0000 (Thu, 18 Jul 2013)
New Revision: 4765
Added:
trunk/glibc-ports/kfreebsd/i386/start.S
Modified:
trunk/glibc-ports/kfreebsd/x86_64/start.S
Log:
force _end symbol in startup file, as it is needed by our brk() implementation
deals with changed behaviour of binutils
Added: trunk/glibc-ports/kfreebsd/i386/start.S
===================================================================
--- trunk/glibc-ports/kfreebsd/i386/start.S (rev 0)
+++ trunk/glibc-ports/kfreebsd/i386/start.S 2013-07-18 15:50:40 UTC (rev 4765)
@@ -0,0 +1,152 @@
+/* Startup code compliant to the ELF i386 ABI.
+ Copyright (C) 1995-2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* 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:
+
+ %edx 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.
+
+ %esp The stack contains the arguments and environment:
+ 0(%esp) argc
+ 4(%esp) argv[0]
+ ...
+ (4*argc)(%esp) NULL
+ (4*(argc+1))(%esp) envp[0]
+ ...
+ NULL
+*/
+
+#include "bp-sym.h"
+#include <libc-symbols.h>
+
+ weak_extern (_end)
+
+ .text
+ .globl _start
+ .type _start, at function
+_start:
+ /* Clear the frame pointer. The ABI suggests this be done, to mark
+ the outermost frame obviously. */
+ xorl %ebp, %ebp
+
+ /* Extract the arguments as encoded on the stack and set up
+ the arguments for `main': argc, argv. envp will be determined
+ later in __libc_start_main. */
+ popl %esi /* Pop the argument count. */
+ movl %esp, %ecx /* argv starts just at the current stack top.*/
+
+ /* Before pushing the arguments align the stack to a 16-byte
+ (SSE needs 16-byte alignment) boundary to avoid penalties from
+ misaligned accesses. Thanks to Edward Seidl <seidl at janed.com>
+ for pointing this out. */
+ andl $0xfffffff0, %esp
+ pushl %eax /* Push garbage because we allocate
+ 28 more bytes. */
+
+ /* Provide the highest stack address to the user code (for stacks
+ which grow downwards). */
+ pushl %esp
+
+ pushl %edx /* Push address of the shared library
+ termination function. */
+
+#ifdef SHARED
+ /* Load PIC register. */
+ call 1f
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+
+ /* Push address of our own entry points to .fini and .init. */
+ leal __libc_csu_fini at GOTOFF(%ebx), %eax
+ pushl %eax
+ leal __libc_csu_init at GOTOFF(%ebx), %eax
+ pushl %eax
+
+ pushl %ecx /* Push second argument: argv. */
+ pushl %esi /* Push first argument: argc. */
+
+ pushl BP_SYM (main)@GOT(%ebx)
+
+ /* 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
+ /* Push address of our own entry points to .fini and .init. */
+ pushl $__libc_csu_fini
+ pushl $__libc_csu_init
+
+ pushl %ecx /* Push second argument: argv. */
+ pushl %esi /* Push first argument: argc. */
+
+ pushl $BP_SYM (main)
+
+ /* 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. */
+
+#ifdef SHARED
+1: movl (%esp), %ebx
+ ret
+#endif
+ /* just reference _end,
+ it is needed as global symbol for brk() usage,
+ it is a dead code on purpose. */
+#ifdef SHARED
+ leal _end at GOTOFF(%ebx), %eax
+#else
+ mov $_end, %eax
+#endif
+
+/* To fulfill the System V/i386 ABI we need this symbol. Yuck, it's so
+ meaningless since we don't support machines < 80386. */
+ .section .rodata
+ .globl _fp_hw
+_fp_hw: .long 3
+ .size _fp_hw, 4
+ .type _fp_hw, at object
+
+/* 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
Modified: trunk/glibc-ports/kfreebsd/x86_64/start.S
===================================================================
--- trunk/glibc-ports/kfreebsd/x86_64/start.S 2013-07-17 05:59:50 UTC (rev 4764)
+++ trunk/glibc-ports/kfreebsd/x86_64/start.S 2013-07-18 15:50:40 UTC (rev 4765)
@@ -73,8 +73,11 @@
*/
#include <sysdep.h>
+#include <libc-symbols.h>
#include "bp-sym.h"
+ weak_extern (_end)
+
.text
.globl _start
.type _start, at function
@@ -136,6 +139,14 @@
#endif
hlt /* Crash if somehow `exit' does return. */
+ /* just reference _end,
+ it is needed as global symbol for brk() usage,
+ it is a dead code on purpose. */
+#ifdef SHARED
+ movq _end at GOTPCREL(%rip), %rax
+#else
+ movq $_end, %rax
+#endif
cfi_endproc
/* Define a symbol for the first piece of initialized data. */
.data
More information about the Glibc-bsd-commits
mailing list