162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Adapted from arm64 version.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * GNU linker script for the VDSO library.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2012 ARM Limited
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Author: Will Deacon <will.deacon@arm.com>
1062306a36Sopenharmony_ci * Heavily based on the vDSO linker scripts for other archs.
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/const.h>
1462306a36Sopenharmony_ci#include <asm/page.h>
1562306a36Sopenharmony_ci#include <asm/vdso.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciOUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
1862306a36Sopenharmony_ciOUTPUT_ARCH(arm)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciSECTIONS
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	PROVIDE(_start = .);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	. = SIZEOF_HEADERS;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	.hash		: { *(.hash) }			:text
2762306a36Sopenharmony_ci	.gnu.hash	: { *(.gnu.hash) }
2862306a36Sopenharmony_ci	.dynsym		: { *(.dynsym) }
2962306a36Sopenharmony_ci	.dynstr		: { *(.dynstr) }
3062306a36Sopenharmony_ci	.gnu.version	: { *(.gnu.version) }
3162306a36Sopenharmony_ci	.gnu.version_d	: { *(.gnu.version_d) }
3262306a36Sopenharmony_ci	.gnu.version_r	: { *(.gnu.version_r) }
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	.note		: { *(.note.*) }		:text	:note
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	.eh_frame_hdr	: { *(.eh_frame_hdr) }		:text	:eh_frame_hdr
3862306a36Sopenharmony_ci	.eh_frame	: { KEEP (*(.eh_frame)) }	:text
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	.dynamic	: { *(.dynamic) }		:text	:dynamic
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	.rodata		: { *(.rodata*) }		:text
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	.text		: { *(.text*) }			:text	=0xe7f001f2
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	.got		: { *(.got) }
4762306a36Sopenharmony_ci	.rel.plt	: { *(.rel.plt) }
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	/DISCARD/	: {
5062306a36Sopenharmony_ci		*(.note.GNU-stack)
5162306a36Sopenharmony_ci		*(.data .data.* .gnu.linkonce.d.* .sdata*)
5262306a36Sopenharmony_ci		*(.bss .sbss .dynbss .dynsbss)
5362306a36Sopenharmony_ci	}
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/*
5762306a36Sopenharmony_ci * We must supply the ELF program headers explicitly to get just one
5862306a36Sopenharmony_ci * PT_LOAD segment, and set the flags explicitly to make segments read-only.
5962306a36Sopenharmony_ci */
6062306a36Sopenharmony_ciPHDRS
6162306a36Sopenharmony_ci{
6262306a36Sopenharmony_ci	text		PT_LOAD		FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */
6362306a36Sopenharmony_ci	dynamic		PT_DYNAMIC	FLAGS(4);		/* PF_R */
6462306a36Sopenharmony_ci	note		PT_NOTE		FLAGS(4);		/* PF_R */
6562306a36Sopenharmony_ci	eh_frame_hdr	PT_GNU_EH_FRAME;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciVERSION
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	LINUX_2.6 {
7162306a36Sopenharmony_ci	global:
7262306a36Sopenharmony_ci		__vdso_clock_gettime;
7362306a36Sopenharmony_ci		__vdso_gettimeofday;
7462306a36Sopenharmony_ci		__vdso_clock_getres;
7562306a36Sopenharmony_ci		__vdso_clock_gettime64;
7662306a36Sopenharmony_ci	local: *;
7762306a36Sopenharmony_ci	};
7862306a36Sopenharmony_ci}
79