From 7ec40a1d7ec90af03d513a4cfa042ce5886e1baa Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Mon, 5 Jan 2026 15:14:35 -0500 Subject: [PATCH] custom linker script for user apps to guarantee that sections are page-aligned --- make-build.sh | 38 ++++++++++++++++++++------------------ src/user-apps/link.ld | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 src/user-apps/link.ld diff --git a/make-build.sh b/make-build.sh index 302157e..5747e4d 100644 --- a/make-build.sh +++ b/make-build.sh @@ -52,7 +52,7 @@ echo " command = ld -r \$in -o \$out" >> build.ninja #eventually maybe a libc will be linked in echo "rule user_app_ld" >> build.ninja -echo " command = ld ${COMMON_LD_FLAGS} \$in -o \$out" >> build.ninja +echo " command = ld ${COMMON_LD_FLAGS} -T src/user-apps/link.ld \$in -o \$out" >> build.ninja #builds everything in a directory # $1 - source directory @@ -102,25 +102,27 @@ cp_apps="" app_deps="" for dir in src/user-apps/*; do + if [ -d $dir ]; then + + if [ -e $dir/libraries.txt ]; then + lib_paths=$(cat $dir/libraries.txt | sed -e 's/^.*$/build\/user-libs\/\0\/lib\0.o/' | tr '\n' ' ') + else + lib_paths="" + fi + + app_name=$(echo $dir | sed -e 's/^src\/user-apps\///') + build_all $dir user_cc user_app_ld $app_name.elf "$lib_paths" + + build_elf=$(echo $dir | sed -e 's/^src/build/')/$app_name.elf + disk_dir=build/disk/calcite/apps/$app_name + disk_elf=$disk_dir/$app_name.elf + + cp_apps=$(echo "$cp_apps" \ + "mkdir -p $disk_dir &&" \ + "cp $build_elf $disk_elf &&") + app_deps="$app_deps $build_elf" - if [ -e $dir/libraries.txt ]; then - lib_paths=$(cat $dir/libraries.txt | sed -e 's/^.*$/build\/user-libs\/\0\/lib\0.o/' | tr '\n' ' ') - else - lib_paths="" fi - - app_name=$(echo $dir | sed -e 's/^src\/user-apps\///') - build_all $dir user_cc user_app_ld $app_name.elf "$lib_paths" - - build_elf=$(echo $dir | sed -e 's/^src/build/')/$app_name.elf - disk_dir=build/disk/calcite/apps/$app_name - disk_elf=$disk_dir/$app_name.elf - - cp_apps=$(echo "$cp_apps" \ - "mkdir -p $disk_dir &&" \ - "cp $build_elf $disk_elf &&") - app_deps="$app_deps $build_elf" - done echo "rule disk" >> build.ninja diff --git a/src/user-apps/link.ld b/src/user-apps/link.ld new file mode 100644 index 0000000..84c8d32 --- /dev/null +++ b/src/user-apps/link.ld @@ -0,0 +1,39 @@ +OUTPUT_FORMAT(elf64-x86-64) +OUTPUT_ARCH(i386:x86-64) + +ENTRY(_start) + +PHDRS { + rx PT_LOAD FLAGS(5); + ro PT_LOAD FLAGS(4); + rw PT_LOAD FLAGS(6); +} + +SECTIONS { + + . = 0x400000; + + .text : { + *(.text .text.*) + } : rx + + . = ALIGN(4096); + + .rodata : { + *(.rodata .rodata.*) + } : ro + + . = ALIGN(4096); + + .data : { + *(.data .data.*) + } : rw + + . = ALIGN(4096); + + .bss : { + *(.bss .bss.*) + *(COMMON) + } : rw + +}