mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [BUG] Padding inserted by linker breaks magicvar linker array
@ 2019-11-04  7:42 Ahmad Fatoum
  2019-11-04  8:36 ` Ahmad Fatoum
  0 siblings, 1 reply; 2+ messages in thread
From: Ahmad Fatoum @ 2019-11-04  7:42 UTC (permalink / raw)
  To: barebox

Hi,

I run into a crash with barebox master[1] when running the magicvar command.
The culprit seems to be 8 bytes of padding inserted between
__barebox_magicvar_start and OPTARG, the first array element:

                  0x0000000000061918                __barebox_magicvar_start = .
   *(SORT_BY_NAME(.barebox_magicvar*))
=> *fill*         0x0000000000061918        0x8
   .barebox_magicvar_OPTARG
                  0x0000000000061920       0x10 common/built-in.o
                  0x0000000000061920                __barebox_magicvar_OPTARG

The 8 byte *fill*er aligns the .barebox_magicvar_OPTARG section to 16 bytes.
Via addition and removal of dummy initcalls, we can shift the magicvars around
until we no longer straddle the 16 bit boundary:

                 0x0000000000061910                __barebox_magicvar_start = .
   *(SORT_BY_NAME(.barebox_magicvar*))
   .barebox_magicvar_OPTARG
                 0x0000000000061910       0x10 common/built-in.o
                 0x0000000000061910                __barebox_magicvar_OPTARG

Now running magicvar no longer crashes. We can achieve the alignment reliably by
adding . = ALIGN(16) at the start of the BAREBOX_MAGICVARS definition in
include/asm-generic/barebox.lds.h.

Does someone know what controls this 16 byte (or maybe 32 byte?) alignment?
Do we need to explicitly align the other linker array start symbols as well or
is there a better way?

Interestingly, the barebox_cmd array which I would've expected to behave the same
doesn't:

               0x0000000000061638                __barebox_cmd_start = .
*(SORT_BY_NAME(.barebox_cmd*))
.barebox_cmd_2048
               0x0000000000061638        0x8 commands/built-in.o
               0x0000000000061638                barebox_cmd_2048

Here the 8 byte alignment is deemed ok by the linker...

Thoughts?

Cheers,
Ahmad



[1]: master at time of writing is 27ee6010 "console_simple: fix linking error when
     ARCH_HAS_CTRLC enabled". To reproduce the issue I've added a single dummy initcall.
     I can provide defconfig if requested.
-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [BUG] Padding inserted by linker breaks magicvar linker array
  2019-11-04  7:42 [BUG] Padding inserted by linker breaks magicvar linker array Ahmad Fatoum
@ 2019-11-04  8:36 ` Ahmad Fatoum
  0 siblings, 0 replies; 2+ messages in thread
From: Ahmad Fatoum @ 2019-11-04  8:36 UTC (permalink / raw)
  To: barebox

[-- Attachment #1: Type: text/plain, Size: 2182 bytes --]

On 11/4/19 8:42 AM, Ahmad Fatoum wrote:
> [1]: master at time of writing is 27ee6010 "console_simple: fix linking error when
>      ARCH_HAS_CTRLC enabled". To reproduce the issue I've added a single dummy initcall.
>      I can provide defconfig if requested.

I missed mentioning that I am building for ARCH=x86 compiling as 64-bit EFI
payload with gcc (Debian 8.3.0-6) 8.3.0 Configured with:
../src/configure -v --with-pkgversion='Debian 8.3.0-6'
 --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs
 --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr
 --with-gcc-major-version-only --program-suffix=-8
 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
 --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix
 --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu
 --enable-libstdcxx-debug --enable-libstdcxx-time=yes
 --with-default-libstdcxx-abi=new --enable-gnu-unique-object
 --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie
 --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto
 --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64
 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
 --enable-offload-targets=nvptx-none --without-cuda-driver
 --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu
 --target=x86_64-linux-gnu

While at it, I attached the defconfig. The magicvar crash is reproducible
after applying this patch:

diff --git a/common/startup.c b/common/startup.c
index c6e119966a0d..42c83d0ccd3c 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -361,6 +361,9 @@ void __noreturn start_barebox(void)
 	}
 }
 
+static int dummy1(void) { return 0; }
+pure_initcall(dummy1);
+
 void __noreturn hang (void)
 {
 	puts ("### ERROR ### Please RESET the board ###\n");


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

[-- Attachment #2: efi_crash_defconfig --]
[-- Type: text/plain, Size: 1881 bytes --]

CONFIG_MMU=y
CONFIG_MALLOC_SIZE=0x0
CONFIG_MALLOC_TLSF=y
CONFIG_HUSH_FANCY_PROMPT=y
CONFIG_CMDLINE_EDITING=y
CONFIG_AUTO_COMPLETE=y
CONFIG_MENU=y
# CONFIG_TIMESTAMP is not set
CONFIG_BOOTM_SHOW_TYPE=y
CONFIG_BOOTM_VERBOSE=y
CONFIG_BOOTM_INITRD=y
CONFIG_BOOTM_OFTREE=y
CONFIG_BLSPEC=y
CONFIG_CONSOLE_ACTIVATE_ALL=y
CONFIG_PARTITION_DISK_EFI=y
# CONFIG_PARTITION_DISK_EFI_GPT_NO_FORCE is not set
# CONFIG_PARTITION_DISK_EFI_GPT_COMPARE is not set
CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
CONFIG_POLLER=y
CONFIG_STATE=y
CONFIG_DEBUG_LL=y
CONFIG_UBSAN=y
CONFIG_UBSAN_NO_ALIGNMENT=y
CONFIG_CMD_DMESG=y
CONFIG_LONGHELP=y
CONFIG_CMD_IOMEM=y
CONFIG_CMD_MEMINFO=y
CONFIG_CMD_GO=y
CONFIG_CMD_LOADB=y
CONFIG_CMD_RESET=y
CONFIG_CMD_UIMAGE=y
CONFIG_CMD_PARTITION=y
CONFIG_CMD_EXPORT=y
CONFIG_CMD_LOADENV=y
CONFIG_CMD_PRINTENV=y
CONFIG_CMD_MAGICVAR=y
CONFIG_CMD_MAGICVAR_HELP=y
CONFIG_CMD_SAVEENV=y
CONFIG_CMD_FILETYPE=y
CONFIG_CMD_LN=y
CONFIG_CMD_MD5SUM=y
CONFIG_CMD_UNCOMPRESS=y
CONFIG_CMD_LET=y
CONFIG_CMD_MSLEEP=y
CONFIG_CMD_READF=y
CONFIG_CMD_SLEEP=y
CONFIG_CMD_DHCP=y
CONFIG_CMD_PING=y
CONFIG_CMD_TFTP=y
CONFIG_CMD_ECHO_E=y
CONFIG_CMD_EDIT=y
CONFIG_CMD_MENU=y
CONFIG_CMD_MENUTREE=y
CONFIG_CMD_READLINE=y
CONFIG_CMD_TIMEOUT=y
CONFIG_CMD_CRC=y
CONFIG_CMD_CRC_CMP=y
CONFIG_CMD_MM=y
CONFIG_CMD_DETECT=y
CONFIG_CMD_FLASH=y
CONFIG_CMD_POWEROFF=y
CONFIG_CMD_WD=y
CONFIG_CMD_2048=y
CONFIG_CMD_BAREBOX_UPDATE=y
CONFIG_CMD_OF_NODE=y
CONFIG_CMD_OF_PROPERTY=y
CONFIG_CMD_OFTREE=y
CONFIG_CMD_TIME=y
CONFIG_CMD_STATE=y
CONFIG_NET=y
CONFIG_NET_NFS=y
CONFIG_NET_NETCONSOLE=y
CONFIG_DRIVER_SERIAL_EFI_STDIO=y
CONFIG_DRIVER_NET_EFI_SNP=y
# CONFIG_SPI is not set
CONFIG_DISK=y
CONFIG_FINTEK_SUPERIO=y
CONFIG_SMSC_SUPERIO=y
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_EFI=y
CONFIG_FS_EXT4=y
CONFIG_FS_TFTP=y
CONFIG_FS_NFS=y
CONFIG_FS_EFI=y
CONFIG_FS_EFIVARFS=y
CONFIG_FS_FAT=y
CONFIG_FS_FAT_WRITE=y
CONFIG_FS_FAT_LFN=y

[-- Attachment #3: Type: text/plain, Size: 149 bytes --]

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-11-04  8:37 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-04  7:42 [BUG] Padding inserted by linker breaks magicvar linker array Ahmad Fatoum
2019-11-04  8:36 ` Ahmad Fatoum

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox