build: Workaround to more explicitly specify output section types
This unbreaks ld.gold.
diff --git a/common/common.mk b/common/common.mk
index 788a3acc..2e8bd0e5 100644
--- a/common/common.mk
+++ b/common/common.mk
@@ -229,61 +229,61 @@ endif
ifeq ($(TARGET),bios)
override C_FILES := $(shell cd .. && find common flanterm/src libfdt/src -type f -name '*.c' | LC_ALL=C sort)
- override S_FILES := $(shell cd .. && find common -type f -name '*.S' | LC_ALL=C sort)
+ override S_FILES := $(shell cd .. && find common -type f -name '*.S' ! -name 'section_type_markers.*' | LC_ALL=C sort)
override ASMX86_FILES := $(shell cd .. && find common -type f -name '*.asm_x86' | LC_ALL=C sort)
override ASM32_FILES := $(shell cd .. && find common -type f -name '*.asm_ia32' | LC_ALL=C sort)
override ASMB_FILES := $(shell cd .. && find common -type f -name '*.asm_bios_ia32' | LC_ALL=C sort)
- override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM32_FILES:.asm_ia32=.o) $(ASMB_FILES:.asm_bios_ia32=.o) $(ASMX86_FILES:.asm_x86=.o))
+ override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, common/section_type_markers.s2.o common/section_type_markers.o $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM32_FILES:.asm_ia32=.o) $(ASMB_FILES:.asm_bios_ia32=.o) $(ASMX86_FILES:.asm_x86=.o))
override OBJ_S2 := $(filter %.s2.o,$(OBJ))
endif
ifeq ($(TARGET),uefi-x86-64)
override C_FILES := $(shell cd .. && find common nyu-efi/x86_64 flanterm/src libfdt/src -type f -name '*.c' | LC_ALL=C sort)
- override S_FILES := $(shell cd .. && find common nyu-efi/x86_64 -type f -name '*.S' | LC_ALL=C sort)
+ override S_FILES := $(shell cd .. && find common nyu-efi/x86_64 -type f -name '*.S' ! -name 'section_type_markers.*' | LC_ALL=C sort)
override ASMX86_FILES := $(shell cd .. && find common -type f -name '*.asm_x86' | LC_ALL=C sort)
override ASM64_FILES := $(shell cd .. && find common -type f -name '*.asm_x86_64' | LC_ALL=C sort)
override ASM64U_FILES := $(shell cd .. && find common -type f -name '*.asm_uefi_x86_64' | LC_ALL=C sort)
- override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_x86_64=.o) $(ASM64U_FILES:.asm_uefi_x86_64=.o) $(ASMX86_FILES:.asm_x86=.o))
+ override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, common/section_type_markers.o $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_x86_64=.o) $(ASM64U_FILES:.asm_uefi_x86_64=.o) $(ASMX86_FILES:.asm_x86=.o))
endif
ifeq ($(TARGET),uefi-ia32)
override C_FILES := $(shell cd .. && find common nyu-efi/ia32 flanterm/src libfdt/src -type f -name '*.c' | LC_ALL=C sort)
- override S_FILES := $(shell cd .. && find common nyu-efi/ia32 -type f -name '*.S' | LC_ALL=C sort)
+ override S_FILES := $(shell cd .. && find common nyu-efi/ia32 -type f -name '*.S' ! -name 'section_type_markers.*' | LC_ALL=C sort)
override ASMX86_FILES := $(shell cd .. && find common -type f -name '*.asm_x86' | LC_ALL=C sort)
override ASM32_FILES := $(shell cd .. && find common -type f -name '*.asm_ia32' | LC_ALL=C sort)
override ASM32U_FILES := $(shell cd .. && find common -type f -name '*.asm_uefi_ia32' | LC_ALL=C sort)
- override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM32_FILES:.asm_ia32=.o) $(ASM32U_FILES:.asm_uefi_ia32=.o) $(ASMX86_FILES:.asm_x86=.o))
+ override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, common/section_type_markers.o $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM32_FILES:.asm_ia32=.o) $(ASM32U_FILES:.asm_uefi_ia32=.o) $(ASMX86_FILES:.asm_x86=.o))
endif
ifeq ($(TARGET),uefi-aarch64)
override C_FILES := $(shell cd .. && find common nyu-efi/aarch64 flanterm/src libfdt/src -type f -name '*.c' | LC_ALL=C sort)
- override S_FILES := $(shell cd .. && find common nyu-efi/aarch64 -type f -name '*.S' | LC_ALL=C sort)
+ override S_FILES := $(shell cd .. && find common nyu-efi/aarch64 -type f -name '*.S' ! -name 'section_type_markers.*' | LC_ALL=C sort)
override ASM64_FILES := $(shell cd .. && find common -type f -name '*.asm_aarch64' | LC_ALL=C sort)
override ASM64U_FILES := $(shell cd .. && find common -type f -name '*.asm_uefi_aarch64' | LC_ALL=C sort)
- override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_aarch64=.o) $(ASM64U_FILES:.asm_uefi_aarch64=.o))
+ override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, common/section_type_markers.o $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_aarch64=.o) $(ASM64U_FILES:.asm_uefi_aarch64=.o))
endif
ifeq ($(TARGET),uefi-riscv64)
override C_FILES := $(shell cd .. && find common nyu-efi/riscv64 flanterm/src libfdt/src -type f -name '*.c' | LC_ALL=C sort)
- override S_FILES := $(shell cd .. && find common nyu-efi/riscv64 -type f -name '*.S' | LC_ALL=C sort)
+ override S_FILES := $(shell cd .. && find common nyu-efi/riscv64 -type f -name '*.S' ! -name 'section_type_markers.*' | LC_ALL=C sort)
override ASM64_FILES := $(shell cd .. && find common -type f -name '*.asm_riscv64' | LC_ALL=C sort)
override ASM64U_FILES := $(shell cd .. && find common -type f -name '*.asm_uefi_riscv64' | LC_ALL=C sort)
- override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_riscv64=.o) $(ASM64U_FILES:.asm_uefi_riscv64=.o))
+ override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, common/section_type_markers.o $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_riscv64=.o) $(ASM64U_FILES:.asm_uefi_riscv64=.o))
endif
ifeq ($(TARGET),uefi-loongarch64)
override C_FILES := $(shell cd .. && find common nyu-efi/loongarch64 flanterm/src libfdt/src -type f -name '*.c' | LC_ALL=C sort)
- override S_FILES := $(shell cd .. && find common nyu-efi/loongarch64 -type f -name '*.S' | LC_ALL=C sort)
+ override S_FILES := $(shell cd .. && find common nyu-efi/loongarch64 -type f -name '*.S' ! -name 'section_type_markers.*' | LC_ALL=C sort)
override ASM64_FILES := $(shell cd .. && find common -type f -name '*.asm_loongarch64' | LC_ALL=C sort)
override ASM64U_FILES := $(shell cd .. && find common -type f -name '*.asm_uefi_loongarch64' | LC_ALL=C sort)
- override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_loongarch64=.o) $(ASM64U_FILES:.asm_uefi_loongarch64=.o))
+ override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, common/section_type_markers.o $(C_FILES:.c=.o) $(S_FILES:.S=.o) $(ASM64_FILES:.asm_loongarch64=.o) $(ASM64U_FILES:.asm_uefi_loongarch64=.o))
endif
override HEADER_DEPS := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.d) $(C_FILES:.S=.d))
diff --git a/common/linker_bios.ld.in b/common/linker_bios.ld.in
index 4c90b986..9c0141dd 100644
--- a/common/linker_bios.ld.in
+++ b/common/linker_bios.ld.in
@@ -16,12 +16,16 @@ SECTIONS
. = 0xf000;
.text.stage2 : {
+ KEEP(*(.text_type_marker_s2))
+
*(.entry)
*(.realmode)
*.s2.o(.text .text.*)
} :text_s2
.rodata.stage2 : {
+ KEEP(*(.rodata_type_marker_s2))
+
*.s2.o(.rodata .rodata.*)
build_id_s2 = .;
@@ -55,6 +59,8 @@ SECTIONS
} :rodata_s2
.data.stage2 : {
+ KEEP(*(.data_type_marker_s2))
+
s2_data_begin = .;
*.s2.o(.data .data.*)
s2_data_end = .;
@@ -64,11 +70,15 @@ SECTIONS
#ifndef LINKER_STAGE2ONLY
.text.stage3 : {
+ KEEP(*(.text_type_marker))
+
stage3_addr = .;
*(.text .text.*)
} :text_s3
.rodata.stage3 : {
+ KEEP(*(.rodata_type_marker))
+
*(.rodata .rodata.*)
build_id_s3 = .;
@@ -82,6 +92,8 @@ SECTIONS
} :rodata_s3
.data.stage3 : {
+ KEEP(*(.data_type_marker))
+
data_begin = .;
*(.data .data.*)
data_end = .;
diff --git a/common/linker_uefi_aarch64.ld.in b/common/linker_uefi_aarch64.ld.in
index e6bcb2ab..5ad15312 100644
--- a/common/linker_uefi_aarch64.ld.in
+++ b/common/linker_uefi_aarch64.ld.in
@@ -17,6 +17,8 @@ SECTIONS
__image_size = ABSOLUTE(__image_end - __image_base);
.text : {
+ KEEP(*(.text_type_marker))
+
KEEP(*(.pe_header))
. = ALIGN(0x1000);
@@ -30,6 +32,8 @@ SECTIONS
__text_size = ABSOLUTE(__text_end - __text_start);
.rodata : {
+ KEEP(*(.rodata_type_marker))
+
__reloc_start = ABSOLUTE(.);
*(.dummy_reloc)
@@ -48,6 +52,8 @@ SECTIONS
} :rodata
.data : {
+ KEEP(*(.data_type_marker))
+
data_begin = .;
*(.data .data.*)
*(.bss .bss.*)
diff --git a/common/linker_uefi_ia32.ld.in b/common/linker_uefi_ia32.ld.in
index a1133359..057426fc 100644
--- a/common/linker_uefi_ia32.ld.in
+++ b/common/linker_uefi_ia32.ld.in
@@ -17,6 +17,8 @@ SECTIONS
__image_size = ABSOLUTE(__image_end - __image_base);
.text : {
+ KEEP(*(.text_type_marker))
+
KEEP(*(.pe_header))
. = ALIGN(0x1000);
@@ -30,6 +32,8 @@ SECTIONS
__text_size = ABSOLUTE(__text_end - __text_start);
.rodata : {
+ KEEP(*(.rodata_type_marker))
+
__reloc_start = ABSOLUTE(.);
*(.dummy_reloc)
@@ -48,6 +52,8 @@ SECTIONS
} :rodata
.data : {
+ KEEP(*(.data_type_marker))
+
data_begin = .;
*(.data .data.*)
*(.bss .bss.*)
diff --git a/common/linker_uefi_loongarch64.ld.in b/common/linker_uefi_loongarch64.ld.in
index 4c99f083..4d0dc746 100644
--- a/common/linker_uefi_loongarch64.ld.in
+++ b/common/linker_uefi_loongarch64.ld.in
@@ -17,6 +17,8 @@ SECTIONS
__image_size = ABSOLUTE(__image_end - __image_base);
.text : {
+ KEEP(*(.text_type_marker))
+
KEEP(*(.pe_header))
. = ALIGN(0x1000);
@@ -30,6 +32,8 @@ SECTIONS
__text_size = ABSOLUTE(__text_end - __text_start);
.rodata : {
+ KEEP(*(.rodata_type_marker))
+
__reloc_start = ABSOLUTE(.);
*(.dummy_reloc)
@@ -48,6 +52,8 @@ SECTIONS
} :rodata
.data : {
+ KEEP(*(.data_type_marker))
+
data_begin = .;
*(.data .data.*)
*(.bss .bss.*)
diff --git a/common/linker_uefi_riscv64.ld.in b/common/linker_uefi_riscv64.ld.in
index 55f2a9c6..c36a6870 100644
--- a/common/linker_uefi_riscv64.ld.in
+++ b/common/linker_uefi_riscv64.ld.in
@@ -17,6 +17,8 @@ SECTIONS
__image_size = ABSOLUTE(__image_end - __image_base);
.text : {
+ KEEP(*(.text_type_marker))
+
KEEP(*(.pe_header))
. = ALIGN(0x1000);
@@ -30,6 +32,8 @@ SECTIONS
__text_size = ABSOLUTE(__text_end - __text_start);
.rodata : {
+ KEEP(*(.rodata_type_marker))
+
__reloc_start = ABSOLUTE(.);
*(.dummy_reloc)
@@ -48,6 +52,8 @@ SECTIONS
} :rodata
.data : {
+ KEEP(*(.data_type_marker))
+
data_begin = .;
*(.data .data.*)
*(.sdata .sdata.*)
diff --git a/common/linker_uefi_x86_64.ld.in b/common/linker_uefi_x86_64.ld.in
index 0176a510..e77c6a79 100644
--- a/common/linker_uefi_x86_64.ld.in
+++ b/common/linker_uefi_x86_64.ld.in
@@ -17,6 +17,8 @@ SECTIONS
__image_size = ABSOLUTE(__image_end - __image_base);
.text : {
+ KEEP(*(.text_type_marker))
+
KEEP(*(.pe_header))
. = ALIGN(0x1000);
@@ -30,6 +32,8 @@ SECTIONS
__text_size = ABSOLUTE(__text_end - __text_start);
.rodata : {
+ KEEP(*(.rodata_type_marker))
+
__reloc_start = ABSOLUTE(.);
*(.dummy_reloc)
@@ -48,6 +52,8 @@ SECTIONS
} :rodata
.data : {
+ KEEP(*(.data_type_marker))
+
data_begin = .;
*(.data .data.*)
*(.bss .bss.*)
diff --git a/common/section_type_markers.S b/common/section_type_markers.S
new file mode 100644
index 00000000..b51566ff
--- /dev/null
+++ b/common/section_type_markers.S
@@ -0,0 +1,7 @@
+// These are hard to explain, but they are basically used to set the output section
+// type, as there is no standard, reliable, or even existing way to do so within the
+// linker script. This is mostly for ld.gold.
+
+.section .text_type_marker,"ax",%progbits
+.section .rodata_type_marker,"a",%progbits
+.section .data_type_marker,"wa",%progbits
diff --git a/common/section_type_markers.s2.S b/common/section_type_markers.s2.S
new file mode 100644
index 00000000..540b5699
--- /dev/null
+++ b/common/section_type_markers.s2.S
@@ -0,0 +1,5 @@
+// Same as section_type_markers.S, but for BIOS stage2.
+
+.section .text_type_marker_s2,"ax",%progbits
+.section .rodata_type_marker_s2,"a",%progbits
+.section .data_type_marker_s2,"wa",%progbits
