mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-28 04:03:35 +08:00
c5684fdb2b
Continuing the removal of the obsolete INTDEF / INTUSE mechanism, this patch eliminates its use for _dl_init. Since _dl_init was already declared with hidden visibility, creating a second hidden alias for it was completely pointless, so this patch replaces all uses of _dl_init_internal with plain _dl_init instead of using hidden_proto / hidden_def (which are only needed when you want a hidden alias for a non-hidden symbol; it's quite possible there are cases where they are used but don't need to be because the symbol in question is not part of the public ABI and is only used within a single library, so using attributes_hidden instead would suffice). Tested for x86_64 that installed stripped shared libraries are unchanged by the patch. [BZ #14132] * elf/dl-init.c (_dl_init): Don't use INTDEF. * sysdeps/aarch64/dl-machine.h (RTLD_START): Use _dl_init instead of _dl_init_internal. * sysdeps/alpha/dl-machine.h (RTLD_START): Likewise. * sysdeps/arm/dl-machine.h (RTLD_START): Likewise. * sysdeps/hppa/dl-machine.h (RTLD_START): Likewise. * sysdeps/i386/dl-machine.h (RTLD_START): Likewise. * sysdeps/ia64/dl-machine.h (RTLD_START): Likewise. * sysdeps/m68k/dl-machine.h (RTLD_START): Likewise. * sysdeps/microblaze/dl-machine.h (RTLD_START): Likewise. * sysdeps/mips/dl-machine.h (RTLD_START): Likewise. * sysdeps/powerpc/powerpc32/dl-start.S (_start): Likewise. * sysdeps/s390/s390-32/dl-machine.h (RTLD_START): Likewise. * sysdeps/s390/s390-64/dl-machine.h (RTLD_START): Likewise. * sysdeps/sh/dl-machine.h (RTLD_START): Likewise. * sysdeps/sparc/sparc32/dl-machine.h (RTLD_START): Likewise. * sysdeps/sparc/sparc64/dl-machine.h (RTLD_START): Likewise. * sysdeps/tile/dl-start.S (_start): Likewise. * sysdeps/x86_64/dl-machine.h (RTLD_START): Likewise. * sysdeps/x86_64/x32/dl-machine.h (RTLD_START): Likewise.
115 lines
3.1 KiB
ArmAsm
115 lines
3.1 KiB
ArmAsm
/* Copyright (C) 2011-2014 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
|
|
|
|
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, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <sysdep.h>
|
|
|
|
/* Get address of "sym" in "reg" assuming r51 holds ".Llink". */
|
|
.macro pic_addr reg, sym
|
|
#ifdef __tilegx__
|
|
moveli \reg, hw1_last(\sym - .Llink)
|
|
shl16insli \reg, \reg, hw0(\sym - .Llink)
|
|
ADD_PTR \reg, r51, \reg
|
|
#else
|
|
ADDLI_PTR \reg, r51, lo16(\sym - .Llink)
|
|
auli \reg, \reg, ha16(\sym - .Llink)
|
|
#endif
|
|
.endm
|
|
|
|
.text
|
|
ENTRY (_start)
|
|
/* Linux starts us with sp pointing at the conventional Elf layout,
|
|
but we need to allow two 'caller' words for our ABI convention. */
|
|
{
|
|
move r52, sp
|
|
andi sp, sp, -8
|
|
}
|
|
cfi_def_cfa_register (r52)
|
|
{
|
|
/* Point sp at base of ABI area; point r4 to the caller-sp word. */
|
|
ADDI_PTR sp, sp, -(2 * REGSIZE)
|
|
ADDI_PTR r4, sp, -REGSIZE
|
|
}
|
|
{
|
|
/* Save zero for caller sp in our 'caller' save area, and make
|
|
sure lr has a zero value, to limit backtraces. */
|
|
move lr, zero
|
|
ST r4, zero
|
|
}
|
|
{
|
|
move r0, r52
|
|
jal _dl_start
|
|
}
|
|
/* Save returned start of user program address for later. */
|
|
move r50, r0
|
|
|
|
/* See if we were invoked explicitly with the dynamic loader,
|
|
in which case we have to adjust the argument vector. */
|
|
lnk r51; .Llink:
|
|
pic_addr r4, _dl_skip_args
|
|
LD4U r4, r4
|
|
BEQZT r4, .Lno_skip
|
|
|
|
/* Load the argc word at the initial sp and adjust it.
|
|
We basically jump "sp" up over the first few argv entries
|
|
and write "argc" a little higher up in memory, to be the
|
|
base of the new kernel-initialized stack area. */
|
|
LD_PTR r0, r52
|
|
{
|
|
sub r0, r0, r4
|
|
SHL_PTR_ADD r52, r4, r52
|
|
}
|
|
{
|
|
ST_PTR r52, r0
|
|
SHL_PTR_ADD sp, r4, sp
|
|
}
|
|
andi sp, sp, -8
|
|
|
|
.Lno_skip:
|
|
/* Call_dl_init (_dl_loaded, argc, argv, envp). See elf/start.s
|
|
for the layout of memory here; r52 is pointing to "+0". */
|
|
pic_addr r0, _rtld_local
|
|
{
|
|
LD_PTR r1, r52 /* load argc in r1 */
|
|
ADDLI_PTR r2, r52, __SIZEOF_POINTER__ /* point r2 at argv */
|
|
}
|
|
{
|
|
LD_PTR r0, r0 /* yields _rtld_global._ns_loaded */
|
|
addi r3, r1, 1
|
|
move lr, zero
|
|
}
|
|
{
|
|
SHL_PTR_ADD r3, r3, r2 /* point r3 at envp */
|
|
jal _dl_init
|
|
}
|
|
|
|
/* Call user program whose address we saved in r50.
|
|
We invoke it just like a static binary, but with _dl_fini
|
|
in r0 so we can distinguish. */
|
|
|
|
pic_addr r0, _dl_fini
|
|
move lr, zero
|
|
{
|
|
move sp, r52
|
|
jr r50
|
|
}
|
|
|
|
/* Tell backtracer to give up (_start has no caller). */
|
|
info 2 /* INFO_OP_CANNOT_BACKTRACE */
|
|
|
|
END (_start)
|