1b29f9d13e
This patch from Roland adds a PT_NOTE section to both 32 and 64 bits vDSOs to expose the kernel version to glibc, thus avoiding a uname syscall on every launch. This is equivalent to the patches Roland posted already for x86 and x86-64. Note: the 64 bits .note is actually using the 32 bits format. This is normal. The ELF spec specifies a different format for 64 bits .note, but for some reason, this was never properly implemented, the core dumps for example are all using 32 bits format .note, and binutils cannot even read a 64 bits format .note. Talking to our toolchain folks, they think we'd rather stick to 32 bits format .note everywhere and get the spec fixed some day ... Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
113 lines
3.3 KiB
ArmAsm
113 lines
3.3 KiB
ArmAsm
/*
|
|
* This is the infamous ld script for the 64 bits vdso
|
|
* library
|
|
*/
|
|
#include <asm/vdso.h>
|
|
|
|
OUTPUT_FORMAT("elf64-powerpc", "elf64-powerpc", "elf64-powerpc")
|
|
OUTPUT_ARCH(powerpc:common64)
|
|
ENTRY(_start)
|
|
|
|
SECTIONS
|
|
{
|
|
. = VDSO64_LBASE + SIZEOF_HEADERS;
|
|
.hash : { *(.hash) } :text
|
|
.dynsym : { *(.dynsym) }
|
|
.dynstr : { *(.dynstr) }
|
|
.gnu.version : { *(.gnu.version) }
|
|
.gnu.version_d : { *(.gnu.version_d) }
|
|
.gnu.version_r : { *(.gnu.version_r) }
|
|
|
|
.note : { *(.note.*) } :text :note
|
|
|
|
. = ALIGN (16);
|
|
.text :
|
|
{
|
|
*(.text .stub .text.* .gnu.linkonce.t.*)
|
|
*(.sfpr .glink)
|
|
} :text
|
|
PROVIDE (__etext = .);
|
|
PROVIDE (_etext = .);
|
|
PROVIDE (etext = .);
|
|
|
|
/* Other stuff is appended to the text segment: */
|
|
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
|
|
.rodata1 : { *(.rodata1) }
|
|
.eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr
|
|
.eh_frame : { KEEP (*(.eh_frame)) } :text
|
|
.gcc_except_table : { *(.gcc_except_table) }
|
|
|
|
.opd ALIGN(8) : { KEEP (*(.opd)) }
|
|
.got ALIGN(8) : { *(.got .toc) }
|
|
.rela.dyn ALIGN(8) : { *(.rela.dyn) }
|
|
|
|
.dynamic : { *(.dynamic) } :text :dynamic
|
|
|
|
_end = .;
|
|
PROVIDE (end = .);
|
|
|
|
/* Stabs debugging sections are here too
|
|
*/
|
|
.stab 0 : { *(.stab) }
|
|
.stabstr 0 : { *(.stabstr) }
|
|
.stab.excl 0 : { *(.stab.excl) }
|
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
.stab.index 0 : { *(.stab.index) }
|
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
.comment 0 : { *(.comment) }
|
|
/* DWARF debug sectio/ns.
|
|
Symbols in the DWARF debugging sections are relative to the beginning
|
|
of the section so we begin them at 0. */
|
|
/* DWARF 1 */
|
|
.debug 0 : { *(.debug) }
|
|
.line 0 : { *(.line) }
|
|
/* GNU DWARF 1 extensions */
|
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
|
/* DWARF 1.1 and DWARF 2 */
|
|
.debug_aranges 0 : { *(.debug_aranges) }
|
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
|
/* DWARF 2 */
|
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
|
.debug_line 0 : { *(.debug_line) }
|
|
.debug_frame 0 : { *(.debug_frame) }
|
|
.debug_str 0 : { *(.debug_str) }
|
|
.debug_loc 0 : { *(.debug_loc) }
|
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
|
/* SGI/MIPS DWARF 2 extensions */
|
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
|
.debug_typenames 0 : { *(.debug_typenames) }
|
|
.debug_varnames 0 : { *(.debug_varnames) }
|
|
|
|
/DISCARD/ : { *(.note.GNU-stack) }
|
|
/DISCARD/ : { *(.branch_lt) }
|
|
/DISCARD/ : { *(.data .data.* .gnu.linkonce.d.*) }
|
|
/DISCARD/ : { *(.bss .sbss .dynbss .dynsbss) }
|
|
}
|
|
|
|
PHDRS
|
|
{
|
|
text PT_LOAD FILEHDR PHDRS FLAGS(5); /* PF_R|PF_X */
|
|
note PT_NOTE FLAGS(4); /* PF_R */
|
|
dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
|
|
eh_frame_hdr 0x6474e550; /* PT_GNU_EH_FRAME, but ld doesn't match the name */
|
|
}
|
|
|
|
/*
|
|
* This controls what symbols we export from the DSO.
|
|
*/
|
|
VERSION
|
|
{
|
|
VDSO_VERSION_STRING {
|
|
global:
|
|
__kernel_datapage_offset; /* Has to be there for the kernel to find it */
|
|
__kernel_get_syscall_map;
|
|
__kernel_gettimeofday;
|
|
__kernel_sync_dicache;
|
|
__kernel_sync_dicache_p5;
|
|
__kernel_sigtramp_rt64;
|
|
local: *;
|
|
};
|
|
}
|