summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek BehĂșn <marek.behun@nic.cz>2021-05-20 13:24:06 +0200
committerTom Rini <trini@konsulko.com>2021-05-24 14:21:30 -0400
commitd1f81fd01598071ca9f8263dff43ac8860532f2b (patch)
treeff519fc3f940f6736d5153597f3c7085be617987
parentbe1e77f2868f288a219090ee81427a9b800bb158 (diff)
downloadu-boot-d1f81fd01598071ca9f8263dff43ac8860532f2b.tar.gz
u-boot-d1f81fd01598071ca9f8263dff43ac8860532f2b.tar.xz
u-boot-d1f81fd01598071ca9f8263dff43ac8860532f2b.zip
sandbox: use sections instead of symbols for getopt array boundaries
In style of linked lists, instead of declaring symbols for boundaries of getopt options array in the linker script, declare corresponding sections and retrieve the boundaries via static inline functions. Without this clang's LTO produces binary without any getopt options, because for some reason it thinks that array is empty (start and end symbols are at the same address). Signed-off-by: Marek BehĂșn <marek.behun@nic.cz> Reviewed-by: Simon Glass <sjg@chromium.org>
-rw-r--r--arch/sandbox/cpu/os.c3
-rw-r--r--arch/sandbox/cpu/start.c3
-rw-r--r--arch/sandbox/cpu/u-boot-spl.lds8
-rw-r--r--arch/sandbox/cpu/u-boot.lds8
-rw-r--r--arch/sandbox/include/asm/sections.h21
5 files changed, 32 insertions, 11 deletions
diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index b9ad341861..0d21827e1b 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -375,7 +375,8 @@ static struct option *long_opts;
int os_parse_args(struct sandbox_state *state, int argc, char *argv[])
{
- struct sandbox_cmdline_option **sb_opt = __u_boot_sandbox_option_start;
+ struct sandbox_cmdline_option **sb_opt =
+ __u_boot_sandbox_option_start();
size_t num_options = __u_boot_sandbox_option_count();
size_t i;
diff --git a/arch/sandbox/cpu/start.c b/arch/sandbox/cpu/start.c
index e87365e800..63ca514ebd 100644
--- a/arch/sandbox/cpu/start.c
+++ b/arch/sandbox/cpu/start.c
@@ -58,7 +58,8 @@ static int h_compare_opt(const void *p1, const void *p2)
int sandbox_early_getopt_check(void)
{
struct sandbox_state *state = state_get_current();
- struct sandbox_cmdline_option **sb_opt = __u_boot_sandbox_option_start;
+ struct sandbox_cmdline_option **sb_opt =
+ __u_boot_sandbox_option_start();
size_t num_options = __u_boot_sandbox_option_count();
size_t i;
int max_arg_len, max_noarg_len;
diff --git a/arch/sandbox/cpu/u-boot-spl.lds b/arch/sandbox/cpu/u-boot-spl.lds
index 18160436a3..6754f4ef6c 100644
--- a/arch/sandbox/cpu/u-boot-spl.lds
+++ b/arch/sandbox/cpu/u-boot-spl.lds
@@ -21,9 +21,11 @@ SECTIONS
__priv_data_end = .;
}
- __u_boot_sandbox_option_start = .;
- _u_boot_sandbox_getopt : { KEEP(*(.u_boot_sandbox_getopt)) }
- __u_boot_sandbox_option_end = .;
+ _u_boot_sandbox_getopt : {
+ *(.u_boot_sandbox_getopt_start)
+ KEEP(*(.u_boot_sandbox_getopt))
+ *(.u_boot_sandbox_getopt_end)
+ }
}
INSERT AFTER .data;
diff --git a/arch/sandbox/cpu/u-boot.lds b/arch/sandbox/cpu/u-boot.lds
index a1f509c9ab..6d710618f5 100644
--- a/arch/sandbox/cpu/u-boot.lds
+++ b/arch/sandbox/cpu/u-boot.lds
@@ -13,9 +13,11 @@ SECTIONS
KEEP(*(SORT(.u_boot_list*)));
}
- __u_boot_sandbox_option_start = .;
- _u_boot_sandbox_getopt : { *(.u_boot_sandbox_getopt) }
- __u_boot_sandbox_option_end = .;
+ _u_boot_sandbox_getopt : {
+ *(.u_boot_sandbox_getopt_start)
+ *(.u_boot_sandbox_getopt)
+ *(.u_boot_sandbox_getopt_end)
+ }
.__efi_runtime_start : {
*(.__efi_runtime_start)
diff --git a/arch/sandbox/include/asm/sections.h b/arch/sandbox/include/asm/sections.h
index fbc1bd11a3..f4351ae7db 100644
--- a/arch/sandbox/include/asm/sections.h
+++ b/arch/sandbox/include/asm/sections.h
@@ -13,12 +13,27 @@
struct sandbox_cmdline_option;
-extern struct sandbox_cmdline_option *__u_boot_sandbox_option_start[],
- *__u_boot_sandbox_option_end[];
+static inline struct sandbox_cmdline_option **
+__u_boot_sandbox_option_start(void)
+{
+ static char start[0] __aligned(4) __attribute__((unused))
+ __section(".u_boot_sandbox_getopt_start");
+
+ return (struct sandbox_cmdline_option **)&start;
+}
+
+static inline struct sandbox_cmdline_option **
+__u_boot_sandbox_option_end(void)
+{
+ static char end[0] __aligned(4) __attribute__((unused))
+ __section(".u_boot_sandbox_getopt_end");
+
+ return (struct sandbox_cmdline_option **)&end;
+}
static inline size_t __u_boot_sandbox_option_count(void)
{
- return __u_boot_sandbox_option_end - __u_boot_sandbox_option_start;
+ return __u_boot_sandbox_option_end() - __u_boot_sandbox_option_start();
}
#endif