From mboxrd@z Thu Jan 1 00:00:00 1970 From: Darius Augulis Date: Sat, 30 Oct 2010 23:37:26 +0300 Subject: [U-Boot] ARM: problem with linker option -pie Message-ID: <4CCC8206.40206@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hi all, I've found solution which solves problem of empty command table. Actually the problem is -pie linker option. I removed it and added -fPIC flag to compiler options. Because relocation with such changes fails, I set TEXT_BASE equal to runtime calculated relocation address. And it works! All commands are there. There is this dummy patch: diff --git a/arch/arm/config.mk b/arch/arm/config.mk index 4e165bf..2046c32 100644 --- a/arch/arm/config.mk +++ b/arch/arm/config.mk @@ -33,7 +33,7 @@ STANDALONE_LOAD_ADDR = 0xc100000 endif endif -PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__ +PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__ -fPIC # Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb: PLATFORM_CPPFLAGS += $(call cc-option,-marm,) @@ -67,5 +67,4 @@ LDSCRIPT := $(SRCTREE)/$(CPUDIR)/u-boot.lds # needed for relocation ifndef CONFIG_NAND_SPL -PLATFORM_LDFLAGS += -pie endif And there is small patch for debugging command table: diff --git a/common/hush.c b/common/hush.c index 2188fd4..be92968 100644 --- a/common/hush.c +++ b/common/hush.c @@ -1675,6 +1675,10 @@ static int run_pipe_real(struct pipe *pi) /* Look up command in command table */ + printf("%s %d: cmd_tbl_s: %X, cmd_tbl_e: %X, len: %d\n", + __func__, __LINE__, + &__u_boot_cmd_start, &__u_boot_cmd_end, + &__u_boot_cmd_end - &__u_boot_cmd_start); if ((cmdtp = find_cmd(child->argv[i])) == NULL) { printf ("Unknown command '%s' - try 'help'\n", child->argv[i]); return -1; /* give up after bad command */ Also I did one test with linker script. I defined variable in start.S: .globl _cmd_start _cmd_start: .word __u_boot_cmd_start __u_boot_cmd_start is exported in linker script. Without my patch, disassembled elf looks like this: <...> 57e00048 <_cmd_start>: 57e00048: 00000000 .word 0x00000000 <...> while with patch applied: <..> 57fcb048 <_cmd_start>: 57fcb048: 57fea2b0 .word 0x57fea2b0 <..> Also disassembling u-boot-spl shows good result because there isn't -pie linker option. It's interesting, because if I define .word __u_boot_cmd_start - _start, then *offset* is calculated correctly. So, I assume, with -pie, linker doesn't export variables correctly and in my case pointer to command table is always null. Eric, could your please test your board in the same way I have described and find out whether it helps? This could be toolchain version dependent and other people may not have this problem. Darius.