]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
sandbox: use sections instead of symbols for getopt array boundaries
authorMarek Behún <marek.behun@nic.cz>
Thu, 20 May 2021 11:24:06 +0000 (13:24 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 24 May 2021 18:21:30 +0000 (14:21 -0400)
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>
arch/sandbox/cpu/os.c
arch/sandbox/cpu/start.c
arch/sandbox/cpu/u-boot-spl.lds
arch/sandbox/cpu/u-boot.lds
arch/sandbox/include/asm/sections.h

index b9ad3418610916aed3b91790c407d4ffdfb89270..0d21827e1b73f7eeccb20a75715a5572b8440248 100644 (file)
@@ -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;
 
index e87365e800d5d981fbcbf84eebd500c035650995..63ca514ebd57af41d6fd7b32970f2f96de4f998c 100644 (file)
@@ -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;
index 18160436a36e7c10ef89dedcb3f6c03bde78f70d..6754f4ef6ccb7c73fb6ed5b787a4aa733538bb60 100644 (file)
@@ -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;
index a1f509c9ab021417f0c69215a0fabdba65285922..6d710618f591650c141c1c1dd24160e97af6ec92 100644 (file)
@@ -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)
index fbc1bd11a34162d58fd82b5cdab6ff791dabfea3..f4351ae7dbf7ab3c8ba2107857eab5e4699ce711 100644 (file)
 
 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