From 2bdb30c29e27af7f06317b51bbbcc17e17a29282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Mei=C3=9Fner?= Date: Thu, 24 Oct 2024 16:37:33 +0100 Subject: [PATCH] Adds new linker script and test ELF. --- tests/elfs/elf.ld | 35 ++++++++++++++++++++--------------- tests/elfs/elf_sbpfv1.ld | 26 ++++++++++++++++++++++++++ tests/elfs/elfs.sh | 9 ++++++--- tests/elfs/strict_header.rs | 21 +++++++++++++++++++++ tests/elfs/strict_header.so | Bin 0 -> 13816 bytes 5 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 tests/elfs/elf_sbpfv1.ld create mode 100644 tests/elfs/strict_header.rs create mode 100644 tests/elfs/strict_header.so diff --git a/tests/elfs/elf.ld b/tests/elfs/elf.ld index e01debd2..d57647af 100644 --- a/tests/elfs/elf.ld +++ b/tests/elfs/elf.ld @@ -1,26 +1,31 @@ PHDRS { - text PT_LOAD ; + text PT_LOAD ; rodata PT_LOAD ; - data PT_LOAD ; - dynamic PT_DYNAMIC ; + stack PT_GNU_STACK ; + heap PT_LOAD ; + dynsym PT_LOAD ; + other PT_NULL ; } SECTIONS { - . = SIZEOF_HEADERS; - .text : { *(.text*) } :text - .rodata : { *(.rodata*) } :rodata - .data.rel.ro : { *(.data.rel.ro*) } :rodata - .dynamic : { *(.dynamic) } :dynamic - .dynsym : { *(.dynsym) } :data - .dynstr : { *(.dynstr) } :data - .rel.dyn : { *(.rel.dyn) } :data - .data : { *(.data*) } :data - .bss : { *(.bss*) } :data + .text 0x000000000 : { *(.text*) } :text + .rodata 0x100000000 : { *(.rodata*) } :rodata + .bss.stack 0x200000000 : { *(.bss.stack*) } :stack + .bss.heap 0x300000000 : { *(.bss.heap*) } :heap + .dynsym 0xFFFFFFFF00000000 : { *(.dynsym) } :dynsym + .dynstr : { *(.dynstr) } :other + .dynamic : { *(.dynamic) } :other + .symtab : { *(.symtab) } :other + .shstrtab : { *(.shstrtab) } :other + .strtab : { *(.strtab) } :other /DISCARD/ : { + *(.comment*) *(.eh_frame*) - *(.gnu.hash*) - *(.hash*) + *(*hash*) + *(.bss*) + *(.data*) + *(.rel.dyn*) } } diff --git a/tests/elfs/elf_sbpfv1.ld b/tests/elfs/elf_sbpfv1.ld new file mode 100644 index 00000000..859ab669 --- /dev/null +++ b/tests/elfs/elf_sbpfv1.ld @@ -0,0 +1,26 @@ +PHDRS +{ + text PT_LOAD ; + rodata PT_LOAD ; + data PT_LOAD ; + dynamic PT_DYNAMIC ; +} + +SECTIONS +{ + . = SIZEOF_HEADERS; + .text : { *(.text*) } :text + .rodata : { *(.rodata*) } :rodata + .data.rel.ro : { *(.data.rel.ro*) } :rodata + .dynamic : { *(.dynamic) } :dynamic + .dynsym : { *(.dynsym) } :data + .dynstr : { *(.dynstr) } :data + .rel.dyn : { *(.rel.dyn) } :data + .data : { *(.data*) } :data + .bss : { *(.bss*) } :data + /DISCARD/ : { + *(.eh_frame*) + *(.gnu.hash*) + *(.hash*) + } +} diff --git a/tests/elfs/elfs.sh b/tests/elfs/elfs.sh index 5f02e69b..f8cfc974 100755 --- a/tests/elfs/elfs.sh +++ b/tests/elfs/elfs.sh @@ -7,9 +7,12 @@ TOOLCHAIN=../../../agave/sdk/sbf/dependencies/platform-tools RC_COMMON="$TOOLCHAIN/rust/bin/rustc --target sbf-solana-solana --crate-type lib -C panic=abort -C opt-level=2" RC="$RC_COMMON -C target_cpu=sbfv2" RC_V1="$RC_COMMON -C target_cpu=generic" -LD_COMMON="$TOOLCHAIN/llvm/bin/ld.lld -z notext -shared --Bdynamic -entry entrypoint --script elf.ld" -LD="$LD_COMMON --section-start=.text=0x100000000" -LD_V1=$LD_COMMON +LD_COMMON="$TOOLCHAIN/llvm/bin/ld.lld -z notext -shared --Bdynamic -entry entrypoint" +LD="$LD_COMMON --script elf.ld" +LD_V1="$LD_COMMON --script elf_sbpfv1.ld" + +$RC -o strict_header.o strict_header.rs +$LD -o strict_header.so strict_header.o $RC_V1 -o relative_call.o relative_call.rs $LD_V1 -o relative_call_sbpfv1.so relative_call.o diff --git a/tests/elfs/strict_header.rs b/tests/elfs/strict_header.rs new file mode 100644 index 00000000..43388c6d --- /dev/null +++ b/tests/elfs/strict_header.rs @@ -0,0 +1,21 @@ +#![feature(linkage)] + +#[link_section = ".bss.stack"] +pub static _STACK: [u8; 0x1000] = [0; 0x1000]; +#[link_section = ".bss.heap"] +pub static _HEAP: [u8; 0x1000] = [0; 0x1000]; + +static _VAL_A: u64 = 41; +static VAL_B: u64 = 42; +static _VAL_C: u64 = 43; + +#[inline(never)] +#[linkage="external"] +fn foo() -> u64 { + return unsafe { core::ptr::read_volatile(&VAL_B) }; +} + +#[no_mangle] +pub fn entrypoint() -> u64 { + return foo(); +} diff --git a/tests/elfs/strict_header.so b/tests/elfs/strict_header.so new file mode 100644 index 0000000000000000000000000000000000000000..441a850af8a011a20c4941ec334fc45177167e25 GIT binary patch literal 13816 zcmeHO&ubG=5T2&Bt@fZ+5b+>;5D%iuW;fYv4nkv%Myyq-D0&H-{b7r=Dai`%Rc$f!y-^{%Cy_x;?B@lS;d3)h%Wo!(jjl-1j z91hGeMu9aPggJ;{68jlA48%M{L&vDw-8>En$~@vt(3nG=ZBhl{G{*#mcjr@)PSUu; z6A&tF3L2N|DX&R9*e(QMoOyy}p5!CGsk6k}!bWomJB9=xC_D;Nz7F$fT;>yg=3?Jq zy!^cAYEuPN0aZX1Pz6*0RX`O`1yli5Kow90_FaK@{0I3vBAKuFfAee3^aA~#_n>3aA3A zfGVI0r~;~hD)7H5KxYAF&4~b8p~Hn<;JEmFTmYc^aIqQ;i@{1#beFR@%?3fyVKJjwXCK=~)&o4FTI=AJ`mjBhB=oM|3>N%4xkd0?&r z@B_U!ajS+I<@iV9Ri}dh+pr6J?3~p~YbcaQp zJhmpjxpi>UjkV#%s>NbpFkW3rz{O}0_YjxyOM2( z6W1HDN9y-l3*F1OOPYSImWIu|5&3x<`gwcAcI!4y&a=$Rt3lALd7NQ zw(J`TPoY8l@|_p*!J%&V{GI%xJg0p3h1S}>SF^ogXf>P5TDCupKx>xy#+JhO;Gab< zeK*VXn|;mv4vtYHedxKQe)%5L?-1n^KFue-+_#bMGloqw+K7W#!w;=3^>3n0{7ugP z7JX{+ek8v<)+HR1+-4$oUey{O*r(qYT0{6!e;Z?xo2MH1%KZD~Alf_YzlE_;{A<1? Ie%XWn3vh4AnE(I) literal 0 HcmV?d00001