From 87eb9e4ff901f3166318551c5fb0e6311c7763d7 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 e01debd26..d57647aff 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 000000000..859ab6693 --- /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 5f02e69ba..f8cfc974b 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 000000000..43388c6df --- /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..b78eed0a70ab9113e175ea3036921c8aeda6e0e9 GIT binary patch literal 13816 zcmeHO&ubG=5T2&Bt@fZ+5b+>;5D%iuW;fYv4nkv%Myyq-D0&H-{m~X_Q<4?zMSJn! z|DZ?j9t5xcF?v(bli;P!yf;(UHc-VDJj{c6-pqdc5(vEaqP=jvGByU%#$n2M z4hQBKqre&t!W={}iTw;51!5kdp%c{YZ61dNWghV+Xw0F`HmQPenqz{(yZ5=Xhp&OE^~Px2Ap)LG(fW23o*9YX>T6dr{sUx#@#F7pY$aItSO zUVdJ5wW$KCfGVI0r~;~hDxeCe0;+&2pbDr02d=<-{)7Ajk<8cpzxfSkdb!I#@B(x} zRX`O`1yli5Kow90Q~^~$6;K6K0aZX1ICKRr9(o2%pbDr0s(>n>3aA3AfGVI0r~;~h zDxeCe0{^Q5bQWONoCvTLI$Y=_j*HL70|2^@7puXr7_25mcO{F{Y!KxAezma@)#EH| zR{cEjB0q_mZOGP(!RAJPb-e&M$LpFi_Gq7EUtpFEhw&7n7n?)Ryow>ODQ@xPwSd^a8iYo)zE@`e|Im;P!??cUZ*96Kmp| z+WbIwiLb(|2%T(yIHQ^ z>}%$CaEu!1L(e7k%lDXmhbW)$X+H7gzKwjJF>IRAMjXT%erRo}e+zBmZ*l&2=u?yT zBl+dAuHcyDHWRt?s@C|(KK;JX8p4puKn DOh3h; literal 0 HcmV?d00001