[PATCH u-boot v3 20/39] sandbox: use sections instead of symbols for getopt array boundaries

Marek Behún
2021-03-16T12:25:50Z

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>
---
arch/sandbox/cpu/os.c | 3 ++-
arch/sandbox/cpu/start.c | 3 ++-
arch/sandbox/cpu/u-boot-spl.lds | 8 +++++---
arch/sandbox/cpu/u-boot.lds | 8 +++++---
arch/sandbox/include/asm/sections.h | 21 ++++++++++++++++++---
5 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index 3d8af0a52b..6d4fecee1d 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -327,7 +327,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 483a264040..05dc04d43a 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 649abeb5ee..3a86595e85 100644
--- a/arch/sandbox/cpu/u-boot-spl.lds
+++ b/arch/sandbox/cpu/u-boot-spl.lds
@@ -13,9 +13,11 @@ SECTIONS
KEEP(*(SORT(.u_boot_list*)));
}

- __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 936da5e140..1d917a3244 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
--
2.26.2