path: root/common
diff options
authorSascha Hauer <>2019-10-14 11:48:43 +0200
committerSascha Hauer <>2019-10-14 12:03:30 +0200
commit1e4a948673d709a2f8fcb9229b3cca77f3a25d51 (patch)
tree3e55bf42cf7bef48b1e304914a273786102fd676 /common
parent59523901d29386f0bf86750b6bf8c8222ab22a33 (diff)
command: Use array of pointers to commands
We used to store the commands as a linker array. One problem with this is that on X86_64 for unknown reasons the linker uses a different struct alignment than the compiler, so when we use the linker to compose the array and the compiler to iterate over it we have to play tricks with manually adjusting the alignment. The other problem is that we declare the commands as const (and also put it in .rodata), but in fact we do not treat it as const: we put the commands onto a list which modifies the struct list_head list member of struct command. With this patch we no longer put the command themselves into an array, but instead create an array of pointers to the commands. This inherently solves the second issue as well. Signed-off-by: Sascha Hauer <>
Diffstat (limited to 'common')
1 files changed, 4 insertions, 4 deletions
diff --git a/common/command.c b/common/command.c
index d9cc4a6..4984593 100644
--- a/common/command.c
+++ b/common/command.c
@@ -149,12 +149,12 @@ EXPORT_SYMBOL(find_cmd);
static int init_command_list(void)
- struct command *cmdtp;
+ struct command * const *cmdtp;
- for (cmdtp = &__barebox_cmd_start;
- cmdtp != &__barebox_cmd_end;
+ for (cmdtp = __barebox_cmd_start;
+ cmdtp != __barebox_cmd_end;
- register_command(cmdtp);
+ register_command(*cmdtp);
return 0;