From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@pengutronix.de>
Subject: [PATCH 2/7] lds: implement is_barebox_rodata
Date: Mon, 25 Nov 2024 16:29:22 +0100 [thread overview]
Message-ID: <20241125152927.546493-3-a.fatoum@pengutronix.de> (raw)
In-Reply-To: <20241125152927.546493-1-a.fatoum@pengutronix.de>
Linux defines is_kernel_rodata(), which is mainly used to implement
kstrdup_const/kfree_const, which are useful to avoid duplication of
strings that already have static storage duration.
Implement the same for barebox on all architectures.
Note that this is of limited use on sandbox, because we don't define all
of the linker script ourselves, but this only means that we will have
some unneeded allocations there, which is a non-issue.
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
arch/arm/lib/pbl.lds.S | 4 +++-
arch/arm/lib32/barebox.lds.S | 4 +++-
arch/arm/lib64/barebox.lds.S | 4 +++-
arch/kvx/cpu/barebox.lds.S | 5 ++++-
arch/mips/lib/barebox.lds.S | 4 +++-
arch/mips/lib/pbl.lds.S | 4 +++-
arch/mips/pbl/zbarebox.lds.S | 4 +++-
arch/openrisc/cpu/barebox.lds.S | 4 +++-
arch/powerpc/boards/pcm030/barebox.lds.S | 2 ++
arch/powerpc/mach-mpc85xx/barebox.lds.S | 2 ++
arch/riscv/lib/barebox.lds.S | 4 +++-
arch/riscv/lib/pbl.lds.S | 4 +++-
arch/sandbox/board/barebox.lds.S | 2 ++
arch/x86/mach-efi/elf_ia32_efi.lds.S | 2 ++
arch/x86/mach-efi/elf_x86_64_efi.lds.S | 2 ++
include/asm-generic/sections.h | 18 ++++++++++++++++++
16 files changed, 59 insertions(+), 10 deletions(-)
diff --git a/arch/arm/lib/pbl.lds.S b/arch/arm/lib/pbl.lds.S
index f097ac1fdd46..dad37c9e9bca 100644
--- a/arch/arm/lib/pbl.lds.S
+++ b/arch/arm/lib/pbl.lds.S
@@ -62,6 +62,7 @@ SECTIONS
BAREBOX_PBL_SIZE
. = ALIGN(ASM_SZPTR);
+ __start_rodata = .;
__pbl_board_stack_top = .;
.rodata.pbl_board_stack_top : {
*(.pbl_board_stack_top_*)
@@ -76,7 +77,8 @@ SECTIONS
.barebox_imd : { BAREBOX_IMD }
. = ALIGN(PBL_SEGMENT_ALIGN);
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
_sdata = .;
. = ALIGN(4);
diff --git a/arch/arm/lib32/barebox.lds.S b/arch/arm/lib32/barebox.lds.S
index 97f41f72fef7..a52556a35696 100644
--- a/arch/arm/lib32/barebox.lds.S
+++ b/arch/arm/lib32/barebox.lds.S
@@ -31,6 +31,7 @@ SECTIONS
BAREBOX_BARE_INIT_SIZE
. = ALIGN(4);
+ __start_rodata = .;
.rodata : {
*(.rodata*)
RO_DATA_SECTION
@@ -52,7 +53,8 @@ SECTIONS
__stop_unwind_tab = .;
}
#endif
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
_sdata = .;
. = ALIGN(4);
diff --git a/arch/arm/lib64/barebox.lds.S b/arch/arm/lib64/barebox.lds.S
index 1d0cc6dc543e..50e4b6f42cb8 100644
--- a/arch/arm/lib64/barebox.lds.S
+++ b/arch/arm/lib64/barebox.lds.S
@@ -29,12 +29,14 @@ SECTIONS
BAREBOX_BARE_INIT_SIZE
. = ALIGN(4);
+ __start_rodata = .;
.rodata : {
*(.rodata*)
RO_DATA_SECTION
}
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
_sdata = .;
. = ALIGN(4);
diff --git a/arch/kvx/cpu/barebox.lds.S b/arch/kvx/cpu/barebox.lds.S
index 1edaeae18824..b05c1f36e595 100644
--- a/arch/kvx/cpu/barebox.lds.S
+++ b/arch/kvx/cpu/barebox.lds.S
@@ -45,13 +45,16 @@ SECTIONS
KEEP(*(.exception.syscall));
}
+ __start_rodata = .;
+
.rodata ALIGN(8) : {
*(.rodata*)
. = ALIGN(8);
RO_DATA_SECTION
}
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
.data ALIGN(4): {
sdata = .;
diff --git a/arch/mips/lib/barebox.lds.S b/arch/mips/lib/barebox.lds.S
index 0720f9295dff..bbb9b114993d 100644
--- a/arch/mips/lib/barebox.lds.S
+++ b/arch/mips/lib/barebox.lds.S
@@ -29,12 +29,14 @@ SECTIONS
PRE_IMAGE
. = ALIGN(4);
+ __start_rodata = .;
.rodata : {
*(.rodata*)
RO_DATA_SECTION
}
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
_sdata = .;
. = ALIGN(4);
diff --git a/arch/mips/lib/pbl.lds.S b/arch/mips/lib/pbl.lds.S
index 4cf0398f33d1..cca980c35fdf 100644
--- a/arch/mips/lib/pbl.lds.S
+++ b/arch/mips/lib/pbl.lds.S
@@ -32,11 +32,13 @@ SECTIONS
BAREBOX_BARE_INIT_SIZE
. = ALIGN(4);
+ __start_rodata = .;
.rodata : { *(.rodata*) }
.barebox_imd : { BAREBOX_IMD }
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
. = ALIGN(4);
.data : { *(.data*) }
diff --git a/arch/mips/pbl/zbarebox.lds.S b/arch/mips/pbl/zbarebox.lds.S
index e3114dfe2230..97d77229b6fb 100644
--- a/arch/mips/pbl/zbarebox.lds.S
+++ b/arch/mips/pbl/zbarebox.lds.S
@@ -29,11 +29,13 @@ SECTIONS
BAREBOX_BARE_INIT_SIZE
. = ALIGN(4);
+ __start_rodata = .;
.rodata : { *(.rodata*) }
.barebox_imd : { BAREBOX_IMD }
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
. = ALIGN(4);
.data : { *(.data*) }
diff --git a/arch/openrisc/cpu/barebox.lds.S b/arch/openrisc/cpu/barebox.lds.S
index 3fae1af37594..26bb622edc27 100644
--- a/arch/openrisc/cpu/barebox.lds.S
+++ b/arch/openrisc/cpu/barebox.lds.S
@@ -46,6 +46,7 @@ SECTIONS
} > ram
. = ALIGN(4);
+ __start_rodata = .;
.rodata : {
*(.rodata);
*(.rodata.*)
@@ -53,7 +54,8 @@ SECTIONS
RO_DATA_SECTION
} > ram
- __etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ __etext = .;
. = ALIGN(4);
.data : {
diff --git a/arch/powerpc/boards/pcm030/barebox.lds.S b/arch/powerpc/boards/pcm030/barebox.lds.S
index 146b63fe8889..07c2a671a8a9 100644
--- a/arch/powerpc/boards/pcm030/barebox.lds.S
+++ b/arch/powerpc/boards/pcm030/barebox.lds.S
@@ -32,6 +32,7 @@ SECTIONS
*(.text*)
*(.got1*)
. = ALIGN(16);
+ __start_rodata = .;
*(.rodata*)
*(.rodata1*)
*(.rodata.str1.4)
@@ -70,6 +71,7 @@ SECTIONS
/* Read-write section, merged into data segment: */
. = (. + 0x0FFF) & 0xFFFFF000;
+ __end_rodata = .;
_etext = .;
PROVIDE (erotext = .);
_sdata = .;
diff --git a/arch/powerpc/mach-mpc85xx/barebox.lds.S b/arch/powerpc/mach-mpc85xx/barebox.lds.S
index 6e348d4db363..5407ecc7e295 100644
--- a/arch/powerpc/mach-mpc85xx/barebox.lds.S
+++ b/arch/powerpc/mach-mpc85xx/barebox.lds.S
@@ -68,6 +68,7 @@ SECTIONS
PROVIDE (etext = .);
_sdata = .;
+ __start_rodata = .;
.barebox_imd : { BAREBOX_IMD }
.rodata :
@@ -79,6 +80,7 @@ SECTIONS
/* Read-write section, merged into data segment: */
. = (. + 0x00FF) & 0xFFFFFF00;
+ __end_rodata = .;
_erotext = .;
PROVIDE (erotext = .);
.reloc :
diff --git a/arch/riscv/lib/barebox.lds.S b/arch/riscv/lib/barebox.lds.S
index 101615ab052a..2d220e48142b 100644
--- a/arch/riscv/lib/barebox.lds.S
+++ b/arch/riscv/lib/barebox.lds.S
@@ -39,12 +39,14 @@ SECTIONS
BAREBOX_BARE_INIT_SIZE
. = ALIGN(4);
+ __start_rodata = .;
.rodata : {
*(.rodata*)
RO_DATA_SECTION
}
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
_sdata = .;
. = ALIGN(4);
diff --git a/arch/riscv/lib/pbl.lds.S b/arch/riscv/lib/pbl.lds.S
index 0fe7dfda8eb4..3a37d01475b2 100644
--- a/arch/riscv/lib/pbl.lds.S
+++ b/arch/riscv/lib/pbl.lds.S
@@ -29,11 +29,13 @@ SECTIONS
BAREBOX_PBL_SIZE
. = ALIGN(4);
+ __start_rodata = .;
.rodata : { *(.rodata*) }
.barebox_imd : { BAREBOX_IMD }
- _etext = .; /* End of text and rodata section */
+ __end_rodata = .;
+ _etext = .;
.data : { *(.data*) }
diff --git a/arch/sandbox/board/barebox.lds.S b/arch/sandbox/board/barebox.lds.S
index 0102b9333174..60bd9a533ce6 100644
--- a/arch/sandbox/board/barebox.lds.S
+++ b/arch/sandbox/board/barebox.lds.S
@@ -5,9 +5,11 @@
SECTIONS
{
. = ALIGN(64);
+ __start_rodata = .;
.barebox_rodata () : {
RO_DATA_SECTION
}
+ __end_rodata = .;
}
INSERT BEFORE .data;
diff --git a/arch/x86/mach-efi/elf_ia32_efi.lds.S b/arch/x86/mach-efi/elf_ia32_efi.lds.S
index 4b1300724300..0a3b6ef947b9 100644
--- a/arch/x86/mach-efi/elf_ia32_efi.lds.S
+++ b/arch/x86/mach-efi/elf_ia32_efi.lds.S
@@ -36,8 +36,10 @@ SECTIONS
_sdata = .;
.data : {
+ __start_rodata = .;
*(.rodata*)
RO_DATA_SECTION
+ __end_rodata = .;
*(.data)
*(.data1)
*(.data.*)
diff --git a/arch/x86/mach-efi/elf_x86_64_efi.lds.S b/arch/x86/mach-efi/elf_x86_64_efi.lds.S
index cb6a31101eab..ed2ddd52482a 100644
--- a/arch/x86/mach-efi/elf_x86_64_efi.lds.S
+++ b/arch/x86/mach-efi/elf_x86_64_efi.lds.S
@@ -39,8 +39,10 @@ SECTIONS
_sdata = .;
.data : {
+ __start_rodata = .;
*(.rodata*)
RO_DATA_SECTION
+ __end_rodata = .;
*(.got.plt)
*(.got)
*(.data*)
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index 0b2ed5615bd6..35b0dd8cac1a 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -3,7 +3,10 @@
#ifndef _ASM_GENERIC_SECTIONS_H_
#define _ASM_GENERIC_SECTIONS_H_
+#include <linux/types.h>
+
extern char _text[], _stext[], _etext[];
+extern char __start_rodata[], __end_rodata[];
extern char __bss_start[], __bss_stop[];
extern char _sdata[], _edata[];
extern char __bare_init_start[], __bare_init_end[];
@@ -21,4 +24,19 @@ extern char __ctors_start[], __ctors_end[];
#define barebox_image_size (__image_end - __image_start)
#define barebox_bare_init_size (unsigned int)&_barebox_bare_init_size
#define barebox_pbl_size (__piggydata_start - __image_start)
+
+/**
+ * is_barebox_rodata - checks if the pointer address is located in the
+ * .rodata section
+ *
+ * @addr: address to check
+ *
+ * Returns: true if the address is located in .rodata, false otherwise.
+ */
+static inline bool is_barebox_rodata(unsigned long addr)
+{
+ return addr >= (unsigned long)__start_rodata &&
+ addr < (unsigned long)__end_rodata;
+}
+
#endif /* _ASM_GENERIC_SECTIONS_H_ */
--
2.39.5
next prev parent reply other threads:[~2024-11-25 15:32 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-25 15:29 [PATCH 0/7] add proper strdup_const support Ahmad Fatoum
2024-11-25 15:29 ` [PATCH 1/7] sandbox: hostfile: strdup device tree node names Ahmad Fatoum
2024-11-25 15:29 ` Ahmad Fatoum [this message]
2024-11-25 15:29 ` [PATCH 3/7] string: implement proper strdup_const/free_const Ahmad Fatoum
2024-11-25 15:29 ` [PATCH 4/7] treewide: replace basename with kbasename Ahmad Fatoum
2024-11-25 15:29 ` [PATCH 5/7] treewide: use strdup_const where appropriate Ahmad Fatoum
2024-11-25 15:29 ` [PATCH 6/7] fs: efi: replace allocation with local buffer Ahmad Fatoum
2024-11-25 15:29 ` [PATCH 7/7] cdev: fix string leaks in devfs links Ahmad Fatoum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241125152927.546493-3-a.fatoum@pengutronix.de \
--to=a.fatoum@pengutronix.de \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox