Skip to content

Commit cb4ae40

Browse files
committed
Linker: Provide LD script folder via cmdline
This enables shorter relative paths for ld-internal INCLUDE, which adds more flexibility wrt to directory structure.
1 parent 0b44970 commit cb4ae40

File tree

44 files changed

+587
-285
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+587
-285
lines changed

01_wait_forever/Makefile

+19-10
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ BSP ?= rpi3
1515

1616

1717
##--------------------------------------------------------------------------------------------------
18-
## Hardcoded configuration values
18+
## BSP-specific configuration values
1919
##--------------------------------------------------------------------------------------------------
20+
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
2021

21-
# BSP-specific arguments.
2222
ifeq ($(BSP),rpi3)
2323
TARGET = aarch64-unknown-none-softfloat
2424
KERNEL_BIN = kernel8.img
@@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3)
2828
OBJDUMP_BINARY = aarch64-none-elf-objdump
2929
NM_BINARY = aarch64-none-elf-nm
3030
READELF_BINARY = aarch64-none-elf-readelf
31-
LINKER_FILE = src/bsp/raspberrypi/link.ld
31+
LD_SCRIPT_PATH = src/bsp/raspberrypi
3232
RUSTC_MISC_ARGS = -C target-cpu=cortex-a53
3333
else ifeq ($(BSP),rpi4)
3434
TARGET = aarch64-unknown-none-softfloat
@@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4)
3939
OBJDUMP_BINARY = aarch64-none-elf-objdump
4040
NM_BINARY = aarch64-none-elf-nm
4141
READELF_BINARY = aarch64-none-elf-readelf
42-
LINKER_FILE = src/bsp/raspberrypi/link.ld
42+
LD_SCRIPT_PATH = src/bsp/raspberrypi
4343
RUSTC_MISC_ARGS = -C target-cpu=cortex-a72
4444
endif
4545

46-
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
47-
4846
# Export for build.rs.
49-
export LINKER_FILE
47+
export LD_SCRIPT_PATH
48+
5049

51-
KERNEL_ELF = target/$(TARGET)/release/kernel
50+
51+
##--------------------------------------------------------------------------------------------------
52+
## Generic configuration values
53+
##--------------------------------------------------------------------------------------------------
54+
KERNEL_LINKER_SCRIPT = link.ld
55+
KERNEL_ELF = target/$(TARGET)/release/kernel
5256

5357

5458

5559
##--------------------------------------------------------------------------------------------------
5660
## Command building blocks
5761
##--------------------------------------------------------------------------------------------------
58-
RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS)
59-
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs
62+
RUSTFLAGS = $(RUSTC_MISC_ARGS) \
63+
-C link-arg=--library-path=$(LD_SCRIPT_PATH) \
64+
-C link-arg=--script=$(KERNEL_LINKER_SCRIPT)
65+
66+
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \
67+
-D warnings \
68+
-D missing_docs
6069

6170
FEATURES = --features bsp_$(BSP)
6271
COMPILER_ARGS = --target=$(TARGET) \

01_wait_forever/build.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
use std::env;
1+
use std::{env, fs};
22

33
fn main() {
4-
let linker_file = env::var("LINKER_FILE").unwrap_or_default();
4+
let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default();
55

6-
println!("cargo:rerun-if-changed={}", linker_file);
7-
println!("cargo:rerun-if-changed=build.rs");
6+
let files = fs::read_dir(ld_script_path).unwrap();
7+
files
8+
.filter_map(Result::ok)
9+
.filter(|d| {
10+
if let Some(e) = d.path().extension() {
11+
e == "ld"
12+
} else {
13+
false
14+
}
15+
})
16+
.for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display()));
817
}

02_runtime_init/Makefile

+19-10
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ BSP ?= rpi3
1515

1616

1717
##--------------------------------------------------------------------------------------------------
18-
## Hardcoded configuration values
18+
## BSP-specific configuration values
1919
##--------------------------------------------------------------------------------------------------
20+
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
2021

21-
# BSP-specific arguments.
2222
ifeq ($(BSP),rpi3)
2323
TARGET = aarch64-unknown-none-softfloat
2424
KERNEL_BIN = kernel8.img
@@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3)
2828
OBJDUMP_BINARY = aarch64-none-elf-objdump
2929
NM_BINARY = aarch64-none-elf-nm
3030
READELF_BINARY = aarch64-none-elf-readelf
31-
LINKER_FILE = src/bsp/raspberrypi/link.ld
31+
LD_SCRIPT_PATH = src/bsp/raspberrypi
3232
RUSTC_MISC_ARGS = -C target-cpu=cortex-a53
3333
else ifeq ($(BSP),rpi4)
3434
TARGET = aarch64-unknown-none-softfloat
@@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4)
3939
OBJDUMP_BINARY = aarch64-none-elf-objdump
4040
NM_BINARY = aarch64-none-elf-nm
4141
READELF_BINARY = aarch64-none-elf-readelf
42-
LINKER_FILE = src/bsp/raspberrypi/link.ld
42+
LD_SCRIPT_PATH = src/bsp/raspberrypi
4343
RUSTC_MISC_ARGS = -C target-cpu=cortex-a72
4444
endif
4545

46-
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
47-
4846
# Export for build.rs.
49-
export LINKER_FILE
47+
export LD_SCRIPT_PATH
48+
5049

51-
KERNEL_ELF = target/$(TARGET)/release/kernel
50+
51+
##--------------------------------------------------------------------------------------------------
52+
## Generic configuration values
53+
##--------------------------------------------------------------------------------------------------
54+
KERNEL_LINKER_SCRIPT = link.ld
55+
KERNEL_ELF = target/$(TARGET)/release/kernel
5256

5357

5458

5559
##--------------------------------------------------------------------------------------------------
5660
## Command building blocks
5761
##--------------------------------------------------------------------------------------------------
58-
RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS)
59-
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs
62+
RUSTFLAGS = $(RUSTC_MISC_ARGS) \
63+
-C link-arg=--library-path=$(LD_SCRIPT_PATH) \
64+
-C link-arg=--script=$(KERNEL_LINKER_SCRIPT)
65+
66+
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \
67+
-D warnings \
68+
-D missing_docs
6069

6170
FEATURES = --features bsp_$(BSP)
6271
COMPILER_ARGS = --target=$(TARGET) \

02_runtime_init/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ diff -uNr 01_wait_forever/Cargo.toml 02_runtime_init/Cargo.toml
5252
diff -uNr 01_wait_forever/Makefile 02_runtime_init/Makefile
5353
--- 01_wait_forever/Makefile
5454
+++ 02_runtime_init/Makefile
55-
@@ -153,6 +153,8 @@
55+
@@ -162,6 +162,8 @@
5656
$(call colorecho, "\nLaunching objdump")
5757
@$(DOCKER_TOOLS) $(OBJDUMP_BINARY) --disassemble --demangle \
5858
--section .text \

02_runtime_init/build.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
use std::env;
1+
use std::{env, fs};
22

33
fn main() {
4-
let linker_file = env::var("LINKER_FILE").unwrap_or_default();
4+
let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default();
55

6-
println!("cargo:rerun-if-changed={}", linker_file);
7-
println!("cargo:rerun-if-changed=build.rs");
6+
let files = fs::read_dir(ld_script_path).unwrap();
7+
files
8+
.filter_map(Result::ok)
9+
.filter(|d| {
10+
if let Some(e) = d.path().extension() {
11+
e == "ld"
12+
} else {
13+
false
14+
}
15+
})
16+
.for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display()));
817
}

03_hacky_hello_world/Makefile

+19-10
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ BSP ?= rpi3
1515

1616

1717
##--------------------------------------------------------------------------------------------------
18-
## Hardcoded configuration values
18+
## BSP-specific configuration values
1919
##--------------------------------------------------------------------------------------------------
20+
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
2021

21-
# BSP-specific arguments.
2222
ifeq ($(BSP),rpi3)
2323
TARGET = aarch64-unknown-none-softfloat
2424
KERNEL_BIN = kernel8.img
@@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3)
2828
OBJDUMP_BINARY = aarch64-none-elf-objdump
2929
NM_BINARY = aarch64-none-elf-nm
3030
READELF_BINARY = aarch64-none-elf-readelf
31-
LINKER_FILE = src/bsp/raspberrypi/link.ld
31+
LD_SCRIPT_PATH = src/bsp/raspberrypi
3232
RUSTC_MISC_ARGS = -C target-cpu=cortex-a53
3333
else ifeq ($(BSP),rpi4)
3434
TARGET = aarch64-unknown-none-softfloat
@@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4)
3939
OBJDUMP_BINARY = aarch64-none-elf-objdump
4040
NM_BINARY = aarch64-none-elf-nm
4141
READELF_BINARY = aarch64-none-elf-readelf
42-
LINKER_FILE = src/bsp/raspberrypi/link.ld
42+
LD_SCRIPT_PATH = src/bsp/raspberrypi
4343
RUSTC_MISC_ARGS = -C target-cpu=cortex-a72
4444
endif
4545

46-
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
47-
4846
# Export for build.rs.
49-
export LINKER_FILE
47+
export LD_SCRIPT_PATH
48+
5049

51-
KERNEL_ELF = target/$(TARGET)/release/kernel
50+
51+
##--------------------------------------------------------------------------------------------------
52+
## Generic configuration values
53+
##--------------------------------------------------------------------------------------------------
54+
KERNEL_LINKER_SCRIPT = link.ld
55+
KERNEL_ELF = target/$(TARGET)/release/kernel
5256

5357

5458

5559
##--------------------------------------------------------------------------------------------------
5660
## Command building blocks
5761
##--------------------------------------------------------------------------------------------------
58-
RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS)
59-
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs
62+
RUSTFLAGS = $(RUSTC_MISC_ARGS) \
63+
-C link-arg=--library-path=$(LD_SCRIPT_PATH) \
64+
-C link-arg=--script=$(KERNEL_LINKER_SCRIPT)
65+
66+
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \
67+
-D warnings \
68+
-D missing_docs
6069

6170
FEATURES = --features bsp_$(BSP)
6271
COMPILER_ARGS = --target=$(TARGET) \

03_hacky_hello_world/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ diff -uNr 02_runtime_init/Makefile 03_hacky_hello_world/Makefile
7070
OBJDUMP_BINARY = aarch64-none-elf-objdump
7171
NM_BINARY = aarch64-none-elf-nm
7272
READELF_BINARY = aarch64-none-elf-readelf
73-
@@ -71,17 +71,20 @@
73+
@@ -80,17 +80,20 @@
7474
--strip-all \
7575
-O binary
7676

@@ -94,7 +94,7 @@ diff -uNr 02_runtime_init/Makefile 03_hacky_hello_world/Makefile
9494

9595

9696

97-
@@ -169,3 +172,28 @@
97+
@@ -178,3 +181,28 @@
9898
##------------------------------------------------------------------------------
9999
check:
100100
@RUSTFLAGS="$(RUSTFLAGS)" $(CHECK_CMD) --message-format=json

03_hacky_hello_world/build.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
use std::env;
1+
use std::{env, fs};
22

33
fn main() {
4-
let linker_file = env::var("LINKER_FILE").unwrap_or_default();
4+
let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default();
55

6-
println!("cargo:rerun-if-changed={}", linker_file);
7-
println!("cargo:rerun-if-changed=build.rs");
6+
let files = fs::read_dir(ld_script_path).unwrap();
7+
files
8+
.filter_map(Result::ok)
9+
.filter(|d| {
10+
if let Some(e) = d.path().extension() {
11+
e == "ld"
12+
} else {
13+
false
14+
}
15+
})
16+
.for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display()));
817
}

04_safe_globals/Makefile

+19-10
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ BSP ?= rpi3
1515

1616

1717
##--------------------------------------------------------------------------------------------------
18-
## Hardcoded configuration values
18+
## BSP-specific configuration values
1919
##--------------------------------------------------------------------------------------------------
20+
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
2021

21-
# BSP-specific arguments.
2222
ifeq ($(BSP),rpi3)
2323
TARGET = aarch64-unknown-none-softfloat
2424
KERNEL_BIN = kernel8.img
@@ -28,7 +28,7 @@ ifeq ($(BSP),rpi3)
2828
OBJDUMP_BINARY = aarch64-none-elf-objdump
2929
NM_BINARY = aarch64-none-elf-nm
3030
READELF_BINARY = aarch64-none-elf-readelf
31-
LINKER_FILE = src/bsp/raspberrypi/link.ld
31+
LD_SCRIPT_PATH = src/bsp/raspberrypi
3232
RUSTC_MISC_ARGS = -C target-cpu=cortex-a53
3333
else ifeq ($(BSP),rpi4)
3434
TARGET = aarch64-unknown-none-softfloat
@@ -39,24 +39,33 @@ else ifeq ($(BSP),rpi4)
3939
OBJDUMP_BINARY = aarch64-none-elf-objdump
4040
NM_BINARY = aarch64-none-elf-nm
4141
READELF_BINARY = aarch64-none-elf-readelf
42-
LINKER_FILE = src/bsp/raspberrypi/link.ld
42+
LD_SCRIPT_PATH = src/bsp/raspberrypi
4343
RUSTC_MISC_ARGS = -C target-cpu=cortex-a72
4444
endif
4545

46-
QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
47-
4846
# Export for build.rs.
49-
export LINKER_FILE
47+
export LD_SCRIPT_PATH
48+
5049

51-
KERNEL_ELF = target/$(TARGET)/release/kernel
50+
51+
##--------------------------------------------------------------------------------------------------
52+
## Generic configuration values
53+
##--------------------------------------------------------------------------------------------------
54+
KERNEL_LINKER_SCRIPT = link.ld
55+
KERNEL_ELF = target/$(TARGET)/release/kernel
5256

5357

5458

5559
##--------------------------------------------------------------------------------------------------
5660
## Command building blocks
5761
##--------------------------------------------------------------------------------------------------
58-
RUSTFLAGS = -C link-arg=-T$(LINKER_FILE) $(RUSTC_MISC_ARGS)
59-
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) -D warnings -D missing_docs
62+
RUSTFLAGS = $(RUSTC_MISC_ARGS) \
63+
-C link-arg=--library-path=$(LD_SCRIPT_PATH) \
64+
-C link-arg=--script=$(KERNEL_LINKER_SCRIPT)
65+
66+
RUSTFLAGS_PEDANTIC = $(RUSTFLAGS) \
67+
-D warnings \
68+
-D missing_docs
6069

6170
FEATURES = --features bsp_$(BSP)
6271
COMPILER_ARGS = --target=$(TARGET) \

04_safe_globals/build.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
use std::env;
1+
use std::{env, fs};
22

33
fn main() {
4-
let linker_file = env::var("LINKER_FILE").unwrap_or_default();
4+
let ld_script_path = env::var("LD_SCRIPT_PATH").unwrap_or_default();
55

6-
println!("cargo:rerun-if-changed={}", linker_file);
7-
println!("cargo:rerun-if-changed=build.rs");
6+
let files = fs::read_dir(ld_script_path).unwrap();
7+
files
8+
.filter_map(Result::ok)
9+
.filter(|d| {
10+
if let Some(e) = d.path().extension() {
11+
e == "ld"
12+
} else {
13+
false
14+
}
15+
})
16+
.for_each(|f| println!("cargo:rerun-if-changed={}", f.path().display()));
817
}

0 commit comments

Comments
 (0)