xref: /linux/arch/x86/entry/vdso/common/vdso-layout.lds.S (revision 6f7e6393d1ce636bb7ec77a7fe7b77458fddf701)
1693c819fSH. Peter Anvin/* SPDX-License-Identifier: GPL-2.0 */
2693c819fSH. Peter Anvin#include <asm/vdso.h>
3693c819fSH. Peter Anvin#include <asm/vdso/vsyscall.h>
4693c819fSH. Peter Anvin#include <vdso/datapage.h>
5693c819fSH. Peter Anvin
6693c819fSH. Peter Anvin/*
7693c819fSH. Peter Anvin * Linker script for vDSO.  This is an ELF shared object prelinked to
8693c819fSH. Peter Anvin * its virtual address, and with only one read-only segment.
9693c819fSH. Peter Anvin * This script controls its layout.
10693c819fSH. Peter Anvin */
11693c819fSH. Peter Anvin
12693c819fSH. Peter AnvinSECTIONS
13693c819fSH. Peter Anvin{
14693c819fSH. Peter Anvin	/*
15693c819fSH. Peter Anvin	 * User/kernel shared data is before the vDSO.  This may be a little
16693c819fSH. Peter Anvin	 * uglier than putting it after the vDSO, but it avoids issues with
17693c819fSH. Peter Anvin	 * non-allocatable things that dangle past the end of the PT_LOAD
18693c819fSH. Peter Anvin	 * segment.
19693c819fSH. Peter Anvin	 */
20693c819fSH. Peter Anvin
21693c819fSH. Peter Anvin	VDSO_VVAR_SYMS
22693c819fSH. Peter Anvin
23693c819fSH. Peter Anvin	vclock_pages = VDSO_VCLOCK_PAGES_START(vdso_u_data);
24693c819fSH. Peter Anvin	pvclock_page = vclock_pages + VDSO_PAGE_PVCLOCK_OFFSET * PAGE_SIZE;
25693c819fSH. Peter Anvin	hvclock_page = vclock_pages + VDSO_PAGE_HVCLOCK_OFFSET * PAGE_SIZE;
26693c819fSH. Peter Anvin
27693c819fSH. Peter Anvin	. = SIZEOF_HEADERS;
28693c819fSH. Peter Anvin
29693c819fSH. Peter Anvin	.hash		: { *(.hash) }			:text
30693c819fSH. Peter Anvin	.gnu.hash	: { *(.gnu.hash) }
31693c819fSH. Peter Anvin	.dynsym		: { *(.dynsym) }
32693c819fSH. Peter Anvin	.dynstr		: { *(.dynstr) }
33693c819fSH. Peter Anvin	.gnu.version	: { *(.gnu.version) }
34693c819fSH. Peter Anvin	.gnu.version_d	: { *(.gnu.version_d) }
35693c819fSH. Peter Anvin	.gnu.version_r	: { *(.gnu.version_r) }
36693c819fSH. Peter Anvin
37693c819fSH. Peter Anvin	.dynamic	: { *(.dynamic) }		:text	:dynamic
38693c819fSH. Peter Anvin
39693c819fSH. Peter Anvin	.rodata		: {
40693c819fSH. Peter Anvin		*(.rodata*)
41693c819fSH. Peter Anvin		*(.data*)
42693c819fSH. Peter Anvin		*(.sdata*)
43693c819fSH. Peter Anvin		*(.got.plt) *(.got)
44693c819fSH. Peter Anvin		*(.gnu.linkonce.d.*)
45693c819fSH. Peter Anvin		*(.bss*)
46693c819fSH. Peter Anvin		*(.dynbss*)
47693c819fSH. Peter Anvin		*(.gnu.linkonce.b.*)
48693c819fSH. Peter Anvin	}						:text
49693c819fSH. Peter Anvin
50*8717b02bSH. Peter Anvin	.note.gnu.property : {
51693c819fSH. Peter Anvin		*(.note.gnu.property)
52*8717b02bSH. Peter Anvin	}					:text :note :gnu_property
53*8717b02bSH. Peter Anvin	.note		: {
54*8717b02bSH. Peter Anvin		*(.note*)
55*8717b02bSH. Peter Anvin	}					:text :note
56693c819fSH. Peter Anvin
57693c819fSH. Peter Anvin	.eh_frame_hdr	: { *(.eh_frame_hdr) }	:text :eh_frame_hdr
58*8717b02bSH. Peter Anvin	.eh_frame	: {
59*8717b02bSH. Peter Anvin		KEEP (*(.eh_frame))
60*8717b02bSH. Peter Anvin		*(.eh_frame.*)
61*8717b02bSH. Peter Anvin	}					:text
62693c819fSH. Peter Anvin
63693c819fSH. Peter Anvin	/*
64693c819fSH. Peter Anvin	 * Text is well-separated from actual data: there's plenty of
65693c819fSH. Peter Anvin	 * stuff that isn't used at runtime in between.
66693c819fSH. Peter Anvin	 */
67693c819fSH. Peter Anvin
68693c819fSH. Peter Anvin	.text		: {
69693c819fSH. Peter Anvin		*(.text*)
70693c819fSH. Peter Anvin	}						:text	=0x90909090,
71693c819fSH. Peter Anvin
72693c819fSH. Peter Anvin
73693c819fSH. Peter Anvin
74693c819fSH. Peter Anvin	.altinstructions	: { *(.altinstructions) }	:text
75693c819fSH. Peter Anvin	.altinstr_replacement	: { *(.altinstr_replacement) }	:text
76693c819fSH. Peter Anvin
77693c819fSH. Peter Anvin	__ex_table		: { *(__ex_table) }		:text
78693c819fSH. Peter Anvin
79693c819fSH. Peter Anvin	/DISCARD/ : {
80693c819fSH. Peter Anvin		*(.discard)
81693c819fSH. Peter Anvin		*(.discard.*)
82693c819fSH. Peter Anvin		*(__bug_table)
83693c819fSH. Peter Anvin	}
84693c819fSH. Peter Anvin}
85693c819fSH. Peter Anvin
86693c819fSH. Peter Anvin/*
87693c819fSH. Peter Anvin * Very old versions of ld do not recognize this name token; use the constant.
88693c819fSH. Peter Anvin */
89693c819fSH. Peter Anvin#define PT_GNU_EH_FRAME	0x6474e550
90*8717b02bSH. Peter Anvin#define PT_GNU_STACK	0x6474e551
91*8717b02bSH. Peter Anvin#define PT_GNU_PROPERTY	0x6474e553
92693c819fSH. Peter Anvin
93693c819fSH. Peter Anvin/*
94693c819fSH. Peter Anvin * We must supply the ELF program headers explicitly to get just one
95693c819fSH. Peter Anvin * PT_LOAD segment, and set the flags explicitly to make segments read-only.
96693c819fSH. Peter Anvin*/
97*8717b02bSH. Peter Anvin#define PF_R	FLAGS(4)
98*8717b02bSH. Peter Anvin#define PF_RW	FLAGS(6)
99*8717b02bSH. Peter Anvin#define PF_RX	FLAGS(5)
100*8717b02bSH. Peter Anvin
101693c819fSH. Peter AnvinPHDRS
102693c819fSH. Peter Anvin{
103*8717b02bSH. Peter Anvin	text		PT_LOAD		PF_RX FILEHDR PHDRS;
104*8717b02bSH. Peter Anvin	dynamic		PT_DYNAMIC	PF_R;
105*8717b02bSH. Peter Anvin	note		PT_NOTE		PF_R;
106*8717b02bSH. Peter Anvin	eh_frame_hdr	PT_GNU_EH_FRAME PF_R;
107*8717b02bSH. Peter Anvin	gnu_stack	PT_GNU_STACK	PF_RW;
108*8717b02bSH. Peter Anvin	gnu_property	PT_GNU_PROPERTY	PF_R;
109693c819fSH. Peter Anvin}
110