cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vdso-layout.lds.S (2659B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#include <asm/vdso.h>
      3
      4/*
      5 * Linker script for vDSO.  This is an ELF shared object prelinked to
      6 * its virtual address, and with only one read-only segment.
      7 * This script controls its layout.
      8 */
      9
     10SECTIONS
     11{
     12	/*
     13	 * User/kernel shared data is before the vDSO.  This may be a little
     14	 * uglier than putting it after the vDSO, but it avoids issues with
     15	 * non-allocatable things that dangle past the end of the PT_LOAD
     16	 * segment.
     17	 */
     18
     19	vvar_start = . - 4 * PAGE_SIZE;
     20	vvar_page  = vvar_start;
     21
     22	/* Place all vvars at the offsets in asm/vvar.h. */
     23#define EMIT_VVAR(name, offset) vvar_ ## name = vvar_page + offset;
     24#include <asm/vvar.h>
     25#undef EMIT_VVAR
     26
     27	pvclock_page = vvar_start + PAGE_SIZE;
     28	hvclock_page = vvar_start + 2 * PAGE_SIZE;
     29	timens_page  = vvar_start + 3 * PAGE_SIZE;
     30
     31#undef _ASM_X86_VVAR_H
     32	/* Place all vvars in timens too at the offsets in asm/vvar.h. */
     33#define EMIT_VVAR(name, offset) timens_ ## name = timens_page + offset;
     34#include <asm/vvar.h>
     35#undef EMIT_VVAR
     36
     37	. = SIZEOF_HEADERS;
     38
     39	.hash		: { *(.hash) }			:text
     40	.gnu.hash	: { *(.gnu.hash) }
     41	.dynsym		: { *(.dynsym) }
     42	.dynstr		: { *(.dynstr) }
     43	.gnu.version	: { *(.gnu.version) }
     44	.gnu.version_d	: { *(.gnu.version_d) }
     45	.gnu.version_r	: { *(.gnu.version_r) }
     46
     47	.dynamic	: { *(.dynamic) }		:text	:dynamic
     48
     49	.rodata		: {
     50		*(.rodata*)
     51		*(.data*)
     52		*(.sdata*)
     53		*(.got.plt) *(.got)
     54		*(.gnu.linkonce.d.*)
     55		*(.bss*)
     56		*(.dynbss*)
     57		*(.gnu.linkonce.b.*)
     58	}						:text
     59
     60	/*
     61	 * Discard .note.gnu.property sections which are unused and have
     62	 * different alignment requirement from vDSO note sections.
     63	 */
     64	/DISCARD/ : {
     65		*(.note.gnu.property)
     66	}
     67	.note		: { *(.note.*) }		:text	:note
     68
     69	.eh_frame_hdr	: { *(.eh_frame_hdr) }		:text	:eh_frame_hdr
     70	.eh_frame	: { KEEP (*(.eh_frame)) }	:text
     71
     72
     73	/*
     74	 * Text is well-separated from actual data: there's plenty of
     75	 * stuff that isn't used at runtime in between.
     76	 */
     77
     78	.text		: {
     79		*(.text*)
     80	}						:text	=0x90909090,
     81
     82
     83
     84	.altinstructions	: { *(.altinstructions) }	:text
     85	.altinstr_replacement	: { *(.altinstr_replacement) }	:text
     86
     87	__ex_table		: { *(__ex_table) }		:text
     88
     89	/DISCARD/ : {
     90		*(.discard)
     91		*(.discard.*)
     92		*(__bug_table)
     93	}
     94}
     95
     96/*
     97 * Very old versions of ld do not recognize this name token; use the constant.
     98 */
     99#define PT_GNU_EH_FRAME	0x6474e550
    100
    101/*
    102 * We must supply the ELF program headers explicitly to get just one
    103 * PT_LOAD segment, and set the flags explicitly to make segments read-only.
    104 */
    105PHDRS
    106{
    107	text		PT_LOAD		FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */
    108	dynamic		PT_DYNAMIC	FLAGS(4);		/* PF_R */
    109	note		PT_NOTE		FLAGS(4);		/* PF_R */
    110	eh_frame_hdr	PT_GNU_EH_FRAME;
    111}