mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf.git
synced 2026-04-17 22:24:18 -04:00
Currently the vdso doesn't include .note.gnu.property or a GNU noexec stack annotation (the -z noexecstack in the linker script is ineffective because we specify PHDRs explicitly.) The motivation is that the dynamic linker currently do not check these. However, this is a weak excuse: the vdso*.so are also supposed to be usable at link libraries, and there is no reason why the dynamic linker might not want or need to check these in the future, so add them back in -- it is trivial enough. Use symbolic constants for the PHDR permission flags. [ v4: drop unrelated formatting changes ] Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Link: https://patch.msgid.link/20251216212606.1325678-8-hpa@zytor.com
110 lines
2.4 KiB
ArmAsm
110 lines
2.4 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#include <asm/vdso.h>
|
|
#include <asm/vdso/vsyscall.h>
|
|
#include <vdso/datapage.h>
|
|
|
|
/*
|
|
* Linker script for vDSO. This is an ELF shared object prelinked to
|
|
* its virtual address, and with only one read-only segment.
|
|
* This script controls its layout.
|
|
*/
|
|
|
|
SECTIONS
|
|
{
|
|
/*
|
|
* User/kernel shared data is before the vDSO. This may be a little
|
|
* uglier than putting it after the vDSO, but it avoids issues with
|
|
* non-allocatable things that dangle past the end of the PT_LOAD
|
|
* segment.
|
|
*/
|
|
|
|
VDSO_VVAR_SYMS
|
|
|
|
vclock_pages = VDSO_VCLOCK_PAGES_START(vdso_u_data);
|
|
pvclock_page = vclock_pages + VDSO_PAGE_PVCLOCK_OFFSET * PAGE_SIZE;
|
|
hvclock_page = vclock_pages + VDSO_PAGE_HVCLOCK_OFFSET * PAGE_SIZE;
|
|
|
|
. = SIZEOF_HEADERS;
|
|
|
|
.hash : { *(.hash) } :text
|
|
.gnu.hash : { *(.gnu.hash) }
|
|
.dynsym : { *(.dynsym) }
|
|
.dynstr : { *(.dynstr) }
|
|
.gnu.version : { *(.gnu.version) }
|
|
.gnu.version_d : { *(.gnu.version_d) }
|
|
.gnu.version_r : { *(.gnu.version_r) }
|
|
|
|
.dynamic : { *(.dynamic) } :text :dynamic
|
|
|
|
.rodata : {
|
|
*(.rodata*)
|
|
*(.data*)
|
|
*(.sdata*)
|
|
*(.got.plt) *(.got)
|
|
*(.gnu.linkonce.d.*)
|
|
*(.bss*)
|
|
*(.dynbss*)
|
|
*(.gnu.linkonce.b.*)
|
|
} :text
|
|
|
|
.note.gnu.property : {
|
|
*(.note.gnu.property)
|
|
} :text :note :gnu_property
|
|
.note : {
|
|
*(.note*)
|
|
} :text :note
|
|
|
|
.eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr
|
|
.eh_frame : {
|
|
KEEP (*(.eh_frame))
|
|
*(.eh_frame.*)
|
|
} :text
|
|
|
|
/*
|
|
* Text is well-separated from actual data: there's plenty of
|
|
* stuff that isn't used at runtime in between.
|
|
*/
|
|
|
|
.text : {
|
|
*(.text*)
|
|
} :text =0x90909090,
|
|
|
|
|
|
|
|
.altinstructions : { *(.altinstructions) } :text
|
|
.altinstr_replacement : { *(.altinstr_replacement) } :text
|
|
|
|
__ex_table : { *(__ex_table) } :text
|
|
|
|
/DISCARD/ : {
|
|
*(.discard)
|
|
*(.discard.*)
|
|
*(__bug_table)
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Very old versions of ld do not recognize this name token; use the constant.
|
|
*/
|
|
#define PT_GNU_EH_FRAME 0x6474e550
|
|
#define PT_GNU_STACK 0x6474e551
|
|
#define PT_GNU_PROPERTY 0x6474e553
|
|
|
|
/*
|
|
* We must supply the ELF program headers explicitly to get just one
|
|
* PT_LOAD segment, and set the flags explicitly to make segments read-only.
|
|
*/
|
|
#define PF_R FLAGS(4)
|
|
#define PF_RW FLAGS(6)
|
|
#define PF_RX FLAGS(5)
|
|
|
|
PHDRS
|
|
{
|
|
text PT_LOAD PF_RX FILEHDR PHDRS;
|
|
dynamic PT_DYNAMIC PF_R;
|
|
note PT_NOTE PF_R;
|
|
eh_frame_hdr PT_GNU_EH_FRAME PF_R;
|
|
gnu_stack PT_GNU_STACK PF_RW;
|
|
gnu_property PT_GNU_PROPERTY PF_R;
|
|
}
|