On 10/11/11 10:04, Loïc Minier wrote:
>         Hey
>
>  When building u-boot for an ARMv5T platform (versatileqemu_config), the
>  Ubuntu-packaged Linaro cross-toolchain isn't suitable because it
>  only offers an ARMv7T2 libgcc.  But I'd like the build to fail when
>  that happens rather than silently generating an u-boot.bin which will
>  trigger a SIGILL when it hits the first non-ARMv5T instruction.
>
>  I heard that gcc/ld are supposed to check this, but I'm not sure how
>  it's supposed to work; perhaps the way u-boot does its final link
>  prevents this from working properly?
>
>  I tried building u-boot as follows:
>     make O=obj-broken \
>         CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm \
>         OPTFLAGS="-marm -march=armv5te" \
>         versatileqemu_config
>
>     make O=obj-broken \
>         CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm \
>         OPTFLAGS="-marm -march=armv5te" \
>         -j2
>
>  The final link looks like this:
> UNDEF_SYM=`arm-linux-gnueabi-objdump -x 
> /home/lool/git/denx/u-boot/obj-v-broken/board/armltd/versatile/libversatile.o 
> /home/lool/git/denx/u-boot/obj-v-broken/api/libapi.o 
> /home/lool/git/denx/u-boot/obj-v-broken/arch/arm/cpu/arm926ejs/libarm926ejs.o 
> /home/lool/git/denx/u-boot/obj-v-broken/arch/arm/cpu/arm926ejs/versatile/libversatile.o
>  /home/lool/git/denx/u-boot/obj-v-broken/arch/arm/lib/libarm.o 
> /home/lool/git/denx/u-boot/obj-v-broken/common/libcommon.o 
> /home/lool/git/denx/u-boot/obj-v-broken/disk/libdisk.o 
> /home/lool/git/denx/u-boot/obj-v-broken/drivers/bios_emulator/libatibiosemu.o 
> /home/lool/git/denx/u-boot/obj-v-broken/drivers/block/libblock.o 
> /home/lool/git/denx/u-boot/obj-v-broken/drivers/dma/libdma.o 
> /home/lool/git/denx/u-boot/obj-v-broken/drivers/fpga/libfpga.o 
> /home/lool/git/denx/u-boot/obj-v-broken/drivers/gpio/libgpio.o 
> /home/lool/git/denx/u-boot/obj-v-broken/drivers/hwmon/libhwmon.o 
> /home/lool/git/denx/u-boot/obj-v-broken/drivers/i2c/libi2c.o 
> /home/lool/git/denx
/u-boot/obj-v-broken/drivers/input/libinput.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/misc/libmisc.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/mmc/libmmc.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/mtd/libmtd.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/mtd/nand/libnand.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/mtd/onenand/libonenand.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/mtd/spi/libspi_flash.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/mtd/ubi/libubi.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/net/libnet.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/net/phy/libphy.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/pci/libpci.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/pcmcia/libpcmcia.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/power/libpower.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/rtc/librtc.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/serial/libserial.o 
/home/lool/git/denx/u-boot/obj-v-bro
ken/drivers/spi/libspi.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/twserial/libtws.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/usb/eth/libusb_eth.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/usb/gadget/libusb_gadget.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/usb/host/libusb_host.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/usb/musb/libusb_musb.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/usb/phy/libusb_phy.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/video/libvideo.o 
/home/lool/git/denx/u-boot/obj-v-broken/drivers/watchdog/libwatchdog.o 
/home/lool/git/denx/u-boot/obj-v-broken/fs/cramfs/libcramfs.o 
/home/lool/git/denx/u-boot/obj-v-broken/fs/ext2/libext2fs.o 
/home/lool/git/denx/u-boot/obj-v-broken/fs/fat/libfat.o 
/home/lool/git/denx/u-boot/obj-v-broken/fs/fdos/libfdos.o 
/home/lool/git/denx/u-boot/obj-v-broken/fs/jffs2/libjffs2.o 
/home/lool/git/denx/u-boot/obj-v-broken/fs/reiserfs/libreiserfs.o 
/home/lool/git/denx/u-boot/obj-v-broken/fs/ubi
fs/libubifs.o /home/lool/git/denx/u-boot/obj-v-broken/fs/yaffs2/libyaffs2.o 
/home/lool/git/denx/u-boot/obj-v-broken/lib/libfdt/libfdt.o 
/home/lool/git/denx/u-boot/obj-v-broken/lib/libgeneric.o 
/home/lool/git/denx/u-boot/obj-v-broken/lib/lzma/liblzma.o 
/home/lool/git/denx/u-boot/obj-v-broken/lib/lzo/liblzo.o 
/home/lool/git/denx/u-boot/obj-v-broken/lib/zlib/libz.o 
/home/lool/git/denx/u-boot/obj-v-broken/net/libnet.o 
/home/lool/git/denx/u-boot/obj-v-broken/post/libpost.o | sed  -n -e 
's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`; cd 
/home/lool/git/denx/u-boot/obj-v-broken && arm-linux-gnueabi-ld  -pie -T 
/home/lool/git/denx/u-boot/obj-v-broken/u-boot.lds -Bstatic -Ttext 0x10000 
$UNDEF_SYM arch/arm/cpu/arm926ejs/start.o --start-group api/libapi.o 
arch/arm/cpu/arm926ejs/libarm926ejs.o 
arch/arm/cpu/arm926ejs/versatile/libversatile.o arch/arm/lib/libarm.o 
common/libcommon.o disk/libdisk.o drivers/bios_emulator/libatibiosemu.o 
drivers/block/libblock.o drivers/dma/libdma.o drivers/fpga/
libfpga.o drivers/gpio/libgpio.o drivers/hwmon/libhwmon.o drivers/i2c/libi2c.o 
drivers/input/libinput.o drivers/misc/libmisc.o drivers/mmc/libmmc.o 
drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o 
drivers/mtd/onenand/libonenand.o drivers/mtd/spi/libspi_flash.o 
drivers/mtd/ubi/libubi.o drivers/net/libnet.o drivers/net/phy/libphy.o 
drivers/pci/libpci.o drivers/pcmcia/libpcmcia.o drivers/power/libpower.o 
drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o 
drivers/twserial/libtws.o drivers/usb/eth/libusb_eth.o 
drivers/usb/gadget/libusb_gadget.o drivers/usb/host/libusb_host.o 
drivers/usb/musb/libusb_musb.o drivers/usb/phy/libusb_phy.o 
drivers/video/libvideo.o drivers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o 
fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o 
fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o 
lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o 
lib/zlib/libz.o net/libnet.o post/libpost.o
 board/armltd/versatile/libversatile.o --end-group 
/home/lool/git/denx/u-boot/obj-v-broken/arch/arm/lib/eabi_compat.o  -L 
/usr/lib/gcc/arm-linux-gnueabi/4.6.1 -lgcc -Map u-boot.map -o u-boot
>
>  I verified that all the .o files passed above have Tag_CPU_name:
>  "5TE" in their arm-linux-gnueabi-readelf -A output; the only
>  problematic file is -lgcc.
>
>  Note that the final link is done with arm-linux-gnueabi-ld and doesn't
>  set any architecture; I changed it manually to use gcc and pass the
>  -marm -march=armv5te, and had to set -nostdlib too when using gcc:
> arm-linux-gnueabi-gcc -marm -march=armv5te -nostdlib -pie -T 
> /home/lool/git/denx/u-boot/obj-v-broken/u-boot.lds -Bstatic -Ttext 0x10000 
> $UNDEF_SYM arch/arm/cpu/arm926ejs/start.o -Wl,--start-group api/libapi.o 
> arch/arm/cpu/arm926ejs/libarm926ejs.o 
> arch/arm/cpu/arm926ejs/versatile/libversatile.o arch/arm/lib/libarm.o 
> common/libcommon.o disk/libdisk.o drivers/bios_emulator/libatibiosemu.o 
> drivers/block/libblock.o drivers/dma/libdma.o drivers/fpga/libfpga.o 
> drivers/gpio/libgpio.o drivers/hwmon/libhwmon.o drivers/i2c/libi2c.o 
> drivers/input/libinput.o drivers/misc/libmisc.o drivers/mmc/libmmc.o 
> drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o 
> drivers/mtd/onenand/libonenand.o drivers/mtd/spi/libspi_flash.o 
> drivers/mtd/ubi/libubi.o drivers/net/libnet.o drivers/net/phy/libphy.o 
> drivers/pci/libpci.o drivers/pcmcia/libpcmcia.o drivers/power/libpower.o 
> drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o 
> drivers/twserial/libtws.o drivers/usb/eth/libusb_eth.o drivers/usb/
gadget/libusb_gadget.o drivers/usb/host/libusb_host.o 
drivers/usb/musb/libusb_musb.o drivers/usb/phy/libusb_phy.o 
drivers/video/libvideo.o drivers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o 
fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o 
fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o 
lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o 
lib/zlib/libz.o net/libnet.o post/libpost.o 
board/armltd/versatile/libversatile.o -Wl,--end-group 
/home/lool/git/denx/u-boot/obj-v-broken/arch/arm/lib/eabi_compat.o  -L 
/usr/lib/gcc/arm-linux-gnueabi/4.6.1 -lgcc -Wl,-Map u-boot.map -o u-boot
>
>  But this command works and produces an u-boot ELF which has
>  Tag_CPU_name: "7-A".
>

The build attributes were never intended to be used in executables; the
format is too expensive to decode in most situations.  Instead the ABI
specification included an optional PHEADER that had a highly simplified
indication of the executable compatibility of an image (essentially the
architecture).  Unfortunately this has never been added to GNU Binutils.

See PT_ARM_ARCHEXT in the ARM ELF specification (available from infocenter).

R.

>  How would I break the build when libgcc isn't ARMv5T?
>
>    Thanks,


--
Richard Earnshaw             Email: richard.earns...@arm.com
Engineering Manager          Phone: +44 1223 400569 (Direct + VoiceMail)
OpenSource Tools             Switchboard: +44 1223 400400
ARM Ltd                      Fax: +44 1223 400410
110 Fulbourn Rd              Web: http://www.arm.com/
Cambridge, UK. CB1 9NJ

-- IMPORTANT NOTICE: The contents of this email and any attachments are 
confidential and may also be privileged. If you are not the intended recipient, 
please notify the sender immediately and do not disclose the contents to any 
other person, use it for any purpose, or store or copy the information in any 
medium.  Thank you.


_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to