I am using Code sourcery g++ lite toolchain 2013.
Got a project which I integrated into buildroot (which seems to be fine, everything gets called as expected).
waf
is the buildsystem of choice
define EEBUSRESTIFIED_CONFIGURE_CMDS
(cd "$(@D)"; \
$(TARGET_CONFIGURE_OPTS) \
CFLAGS="$(CFLAGS_FOR_BUILD)" \
LDFLAGS="--sysroot=$(STAGING_DIR)" \
LD_LIBRARY_PATH="$(STAGING_DIR)" \
PKG_CONFIG_PATH="$(STAGING_DIR)/usr/lib/pkgconfig" \
PKG_CONFIG_SYSROOT_DIR="$(STAGING_DIR)" \
./waf --dest=$(TARGET_DIR) configure)
endef
shows
Setting top to : /home/bernhard/buildroot-2013.08/output/build/foo-6508f5b36172ba8965372ef96fb350b413ec5d15
Setting out to : /home/bernhard/buildroot-2013.08/output/build/foo-6508f5b36172ba8965372ef96fb350b413ec5d15/build
Checking for program gcc,cc : /home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-gcc
Checking for program ar : /home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-ar
Checking for program glib-genmarshal : /home/bernhard/buildroot-2013.08/output/host/usr/bin/glib-genmarshal
Checking for program perl : /usr/bin/perl
Checking for 'glib-mkenums' : /home/bernhard/buildroot-2013.08/output/host/usr/bin/glib-mkenums
Checking for program glib-compile-schemas : /home/bernhard/buildroot-2013.08/output/host/usr/bin/glib-compile-schemas
Checking for program pkg-config : /home/bernhard/buildroot-2013.08/output/host/usr/bin/pkg-config
Checking for pkg-config version >= '0.26' : yes
Checking for 'glib-2.0' : yes
Checking for 'glib-2.0' version : yes
Checking for 'gobject-2.0' : yes
Checking for 'libsoup-2.4' : yes
Checking for 'libsoup-2.4' version : yes
Checking for 'libxml-2.0' : yes
Checking for 'uuid' : yes
Checking for endianness : little
Checking for inline : inline
which looks fine.
At the compile step
define EEBUSRESTIFIED_BUILD_CMDS
(cd "$(@D)"; \
$(TARGET_CONFIGURE_OPTS) \
LDFLAGS="--sysroot=$(STAGING_DIR)" \
LD_LIBRARY_PATH="$(STAGING_DIR)" \
PKG_CONFIG_PATH="$(STAGING_DIR)/usr/lib/pkgconfig" \
PKG_CONFIG_SYSROOT_DIR="$(STAGING_DIR)" \
./waf --dest=$(TARGET_DIR) build)
endef
it dies with
/home/bernhard/buildroot-2013.08/output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.1/../../../../arm-none-linux-gnueabi/bin/ld: warning: library search path "/usr/lib" is unsafe for cross-compilation
/home/bernhard/buildroot-2013.08/output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.1/../../../../arm-none-linux-gnueabi/bin/ld: warning: library search path "/usr/lib" is unsafe for cross-compilation
/usr/lib/libgobject-2.0.so: file not recognized: File format not recognized
collect2: ld returned 1 exit status
I understand the issue - waf
/ld
tries to link against my host libs, which is doomed to fail.
How can I fix ld to pick up proper library paths? What is the source of this problem?
Here the expanded output of the build command (replaced spaces by linbreaks):
echo
"PATH="/home/bernhard/buildroot-2013.08/output/host/bin:/home/bernhard/buildroot-2013.08/output/host/usr/bin:/home/bernhard/buildroot-2013.08/output/host/usr/sbin/:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/core_perl"
AR="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-ar"
AS="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-as"
LD="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-ld"
NM="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-nm"
CC="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-gcc"
GCC="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-gcc"
CPP="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-cpp"
CXX="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-g++"
FC="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-gfortran"
RANLIB="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-ranlib"
READELF="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-readelf"
STRIP="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-strip"
OBJCOPY="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-objcopy"
OBJDUMP="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-objdump"
AR_FOR_BUILD="/usr/bin/ar"
AS_FOR_BUILD="/usr/bin/as"
CC_FOR_BUILD="/usr/bin/gcc"
GCC_FOR_BUILD="/usr/bin/gcc"
CXX_FOR_BUILD="/usr/bin/g++"
FC_FOR_BUILD="/usr/bin/ld"
LD_FOR_BUILD="/usr/bin/ld"
CPPFLAGS_FOR_BUILD="-I/home/bernhard/buildroot-2013.08/output/host/usr/include"
CFLAGS_FOR_BUILD="-O2
-I/home/bernhard/buildroot-2013.08/output/host/usr/include"
CXXFLAGS_FOR_BUILD="-O2
-I/home/bernhard/buildroot-2013.08/output/host/usr/include"
LDFLAGS_FOR_BUILD="-L/home/bernhard/buildroot-2013.08/output/host/lib
-L/home/bernhard/buildroot-2013.08/output/host/usr/lib
-Wl,-rpath,/home/bernhard/buildroot-2013.08/output/host/usr/lib"
FCFLAGS_FOR_BUILD=""
DEFAULT_ASSEMBLER="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-as"
DEFAULT_LINKER="/home/bernhard/buildroot-2013.08/output/host/usr/bin/arm-none-linux-gnueabi-ld"
CPPFLAGS="-D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE
-D_FILE_OFFSET_BITS=64"
CFLAGS="-D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE
-D_FILE_OFFSET_BITS=64
-pipe
-O2
"
CXXFLAGS="-D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE
-D_FILE_OFFSET_BITS=64
-pipe
-O2
"
LDFLAGS=""
FCFLAGS=""
PKG_CONFIG="/home/bernhard/buildroot-2013.08/output/host/usr/bin/pkg-config"
PERLLIB="/home/bernhard/buildroot-2013.08/output/host/usr/lib/perl"
STAGING_DIR="/home/bernhard/buildroot-2013.08/output/host/usr/arm-buildroot-linux-gnueabi/sysroot""
I tried a couple of combinations for `PKG_CONFIG_*` , with/without `--sysroot` but no success so far.
Already read linux cross compiling and dynamic libraries / linking
For reference, the whole foo.mk
FOO_VERSION = abcd1234
FOO_SITE = ssh://[email protected]/FOO
FOO_SITE_METHOD = git
FOO_LICENSE = unknown
FOO_INSTALL_TARGET = YES
FOO_DEPENDENCIES = util-linux libglib2 libsoup libxml2 host-pkgconf
define FOO_CONFIGURE_CMDS
echo "$(TARGET_CONFIGURE_OPTS)"
(cd "$(@D)"; \
$(TARGET_CONFIGURE_OPTS) \
LDFLAGS="--sysroot=$(STAGING_DIR)" \
LD_LIBRARY_PATH="$(STAGING_DIR)" \
PKG_CONFIG_PATH="$(STAGING_DIR)/usr/lib/pkgconfig" \
PKG_CONFIG_SYSROOT_DIR="$(STAGING_DIR)" \
./waf --dest=$(TARGET_DIR) configure)
endef
define FOO_BUILD_CMDS
(cd "$(@D)"; \
LDFLAGS="--sysroot=$(STAGING_DIR)" \
LD_LIBRARY_PATH="$(STAGING_DIR)" \
PKG_CONFIG_PATH="$(STAGING_DIR)/usr/lib/pkgconfig" \
PKG_CONFIG_SYSROOT_DIR="$(STAGING_DIR)" \
./waf --dest=$(TARGET_DIR) debug)
endef
define FOO_INSTALL_TARGET_CMDS
(cd "$(@D)"; \
./waf --dest=$(TARGET_DIR) install)
endef
define FOO_CLEAN_CMDS
(cd "$(@D)"; \
./waf --dest=$(TARGET_DIR) distclean)
endef
$(eval $(generic-package))
After a
make clean
amake all
I finally got a solution - the trick is to pass flags via LDFLAGS concerningsysroot
to the linker.file
tells me./build/foo.bin: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
which looks quite good.Below the
foo.mk
usedFor reference - the linker output
At the very end you still can see that the wrong paths are present, but by passing the
-L
flags which seem to have a higher priority it still works as supposedI found the root cause - when doing a
libpath
,stlibpath
andincludes
(at least porbably more) are NOT prefixed withdestdir
-- also the options should be--destdir
instead of--dest