linux-wasm/patches/kernel/0007-Use-.section-format-compatible-with-LLVM-as-when-tar.patch
2025-10-31 18:38:01 +01:00

171 lines
4.6 KiB
Diff

From 18c7f0ad07fdf735784c0125e5e05095c01c31eb Mon Sep 17 00:00:00 2001
From: Joel Severin <joel.severin@icemanor.se>
Date: Sun, 12 May 2024 17:27:43 +0200
Subject: [PATCH] Use .section format compatible with LLVM as when targeting
Wasm
LLVM as does apparently need sizes and no "a" flag for sections when
assembling Wasm files. This seems to differ from other targets.
---
scripts/kallsyms.c | 38 +++++++++++++++++++++++++++-----------
usr/initramfs_data.S | 7 +++++--
2 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
index 13af6d0ff..f090766f5 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -287,13 +287,18 @@ static void read_map(const char *in)
fclose(fp);
}
-static void output_label(const char *label)
+static void output_label_begin(const char *label)
{
printf(".globl %s\n", label);
printf("\tALGN\n");
printf("%s:\n", label);
}
+static void output_label_end(const char *label)
+{
+ printf(".size\t%s,.-%s\n", label, label);
+}
+
/* Provide proper symbols relocatability by their '_text' relativeness. */
static void output_address(unsigned long long addr)
{
@@ -395,10 +400,11 @@ static void write_src(void)
printf("#define ALGN .balign 4\n");
printf("#endif\n");
- printf("\t.section .rodata, \"a\"\n");
+ printf("\t.section .rodata, \"\", @\n");
- output_label("kallsyms_num_syms");
+ output_label_begin("kallsyms_num_syms");
printf("\t.long\t%u\n", table_cnt);
+ output_label_end("kallsyms_num_syms");
printf("\n");
/* table of offset markers, that give the offset in the compressed stream
@@ -410,7 +416,7 @@ static void write_src(void)
exit(EXIT_FAILURE);
}
- output_label("kallsyms_names");
+ output_label_begin("kallsyms_names");
off = 0;
for (i = 0; i < table_cnt; i++) {
if ((i & 0xFF) == 0)
@@ -447,6 +453,7 @@ static void write_src(void)
printf(", 0x%02x", table[i]->sym[k]);
printf("\n");
}
+ output_label_end("kallsyms_names");
printf("\n");
/*
@@ -458,14 +465,15 @@ static void write_src(void)
strcpy((char *)table[i]->sym, buf);
}
- output_label("kallsyms_markers");
+ output_label_begin("kallsyms_markers");
for (i = 0; i < ((table_cnt + 255) >> 8); i++)
printf("\t.long\t%u\n", markers[i]);
+ output_label_end("kallsyms_markers");
printf("\n");
free(markers);
- output_label("kallsyms_token_table");
+ output_label_begin("kallsyms_token_table");
off = 0;
for (i = 0; i < 256; i++) {
best_idx[i] = off;
@@ -473,17 +481,19 @@ static void write_src(void)
printf("\t.asciz\t\"%s\"\n", buf);
off += strlen(buf) + 1;
}
+ output_label_end("kallsyms_token_table");
printf("\n");
- output_label("kallsyms_token_index");
+ output_label_begin("kallsyms_token_index");
for (i = 0; i < 256; i++)
printf("\t.short\t%d\n", best_idx[i]);
+ output_label_end("kallsyms_token_index");
printf("\n");
if (!base_relative)
- output_label("kallsyms_addresses");
+ output_label_begin("kallsyms_addresses");
else
- output_label("kallsyms_offsets");
+ output_label_begin("kallsyms_offsets");
for (i = 0; i < table_cnt; i++) {
if (base_relative) {
@@ -521,11 +531,16 @@ static void write_src(void)
printf("\tPTR\t%#llx\n", table[i]->addr);
}
}
+ if (!base_relative)
+ output_label_end("kallsyms_addresses");
+ else
+ output_label_end("kallsyms_offsets");
printf("\n");
if (base_relative) {
- output_label("kallsyms_relative_base");
+ output_label_begin("kallsyms_relative_base");
output_address(relative_base);
+ output_label_end("kallsyms_relative_base");
printf("\n");
}
@@ -534,12 +549,13 @@ static void write_src(void)
cleanup_symbol_name((char *)table[i]->sym);
sort_symbols_by_name();
- output_label("kallsyms_seqs_of_names");
+ output_label_begin("kallsyms_seqs_of_names");
for (i = 0; i < table_cnt; i++)
printf("\t.byte 0x%02x, 0x%02x, 0x%02x\n",
(unsigned char)(table[i]->seq >> 16),
(unsigned char)(table[i]->seq >> 8),
(unsigned char)(table[i]->seq >> 0));
+ output_label_end("kallsyms_seqs_of_names");
printf("\n");
}
diff --git a/usr/initramfs_data.S b/usr/initramfs_data.S
index cd67edc38..dd1990aaf 100644
--- a/usr/initramfs_data.S
+++ b/usr/initramfs_data.S
@@ -22,11 +22,13 @@
in the ELF header, as required by certain architectures.
*/
-.section .init.ramfs,"a"
+.section .init.ramfs,"",@
__irf_start:
.incbin "usr/initramfs_inc_data"
+.size __irf_start,.-__irf_start
__irf_end:
-.section .init.ramfs.info,"a"
+.size __irf_end,0
+.section .init.ramfs.info,"",@
.globl __initramfs_size
__initramfs_size:
#ifdef CONFIG_64BIT
@@ -34,3 +36,4 @@ __initramfs_size:
#else
.long __irf_end - __irf_start
#endif
+.size __initramfs_size,.-__initramfs_size
--
2.25.1