使用 Yocto SDK 的链接问题(对“_rtld_global_ro”的未定义引用)
Linking issue using the Yocto SDK (undefined reference to `_rtld_global_ro')
我正在尝试使用 Yocto SDK 构建应用程序。编译运行良好,但在 linking 时,出现以下 linker 错误:
...
/opt/mydistro/1.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/8.3.0/real-ld: /opt/mydistro/1.0.0/sysroots/cortexa9t2hf-neon-poky-linux-gnueabi/usr/lib/libc.a(getcontext.o): in function `getcontext':
/usr/src/debug/glibc/2.29-r0/git/stdlib/../sysdeps/unix/sysv/linux/arm/getcontext.S:101: undefined reference to `_rtld_global_ro'
/opt/mydistro/1.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/8.3.0/real-ld: /opt/mydistro/1.0.0/sysroots/cortexa9t2hf-neon-poky-linux-gnueabi/usr/lib/libc.a(setcontext.o): in function `__startcontext':
/usr/src/debug/glibc/2.29-r0/git/stdlib/../sysdeps/unix/sysv/linux/arm/setcontext.S:100: undefined reference to `_rtld_global_ro'
collect2: error: ld returned 1 exit status
makefile:116: recipe for target 'ortable' failed
make: *** [ortable] Error 1
我真的不知道为什么找不到对象'_rtld_global_ro'
。有人可以告诉我出了什么问题以及我可以对 link 应用程序做些什么吗?也许,有解决方法吗?
可以使用相同的设置构建其他应用程序而不会出现此问题(使用以下命令获取 SDK):
source /opt/mydistro/1.0.0/environment-setup-cortexa9t2hf-neon-poky-linux-gnueabi
这是图像 bb 文件(我已使用命令 bitbake my-image -c populate_sdk
构建 SDK)。
require recipes-extended/images/core-image-full-cmdline.bb
IMAGE_INSTALL_append = " \
emmy-w1-driver-sdiosdio \
emmy-w1-systemd \
eth-systemd \
can-systemd \
can-utils \
lighttpd \
dnsmasq \
parted \
swupdate \
swupdate-www \
u-boot-fw-utils \
linux-firmware-imx-sdma-imx6q \
"
TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules"
SDKIMAGE_FEATURES_append = " staticdev-pkgs"
这是上游 glibc 源中的一个问题:setcontext
的 ARM 汇编程序版本假定所有 PIC 代码都是动态链接的,这意味着如果 glibc 是在静态 PIE 模式下构建的,则静态链接失败(因为在不提供动态链接器代码的情况下激活 PIC。
您要么需要在没有静态 PIE 支持的情况下构建 glibc(我什至不知道这是 32 位 ARM 支持的配置),要么将 PIC
宏替换为 SHARED
sysdeps/unix/sysv/linux/arm/setcontext.S
.
我正在尝试使用 Yocto SDK 构建应用程序。编译运行良好,但在 linking 时,出现以下 linker 错误:
...
/opt/mydistro/1.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/8.3.0/real-ld: /opt/mydistro/1.0.0/sysroots/cortexa9t2hf-neon-poky-linux-gnueabi/usr/lib/libc.a(getcontext.o): in function `getcontext':
/usr/src/debug/glibc/2.29-r0/git/stdlib/../sysdeps/unix/sysv/linux/arm/getcontext.S:101: undefined reference to `_rtld_global_ro'
/opt/mydistro/1.0.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/8.3.0/real-ld: /opt/mydistro/1.0.0/sysroots/cortexa9t2hf-neon-poky-linux-gnueabi/usr/lib/libc.a(setcontext.o): in function `__startcontext':
/usr/src/debug/glibc/2.29-r0/git/stdlib/../sysdeps/unix/sysv/linux/arm/setcontext.S:100: undefined reference to `_rtld_global_ro'
collect2: error: ld returned 1 exit status
makefile:116: recipe for target 'ortable' failed
make: *** [ortable] Error 1
我真的不知道为什么找不到对象'_rtld_global_ro'
。有人可以告诉我出了什么问题以及我可以对 link 应用程序做些什么吗?也许,有解决方法吗?
可以使用相同的设置构建其他应用程序而不会出现此问题(使用以下命令获取 SDK):
source /opt/mydistro/1.0.0/environment-setup-cortexa9t2hf-neon-poky-linux-gnueabi
这是图像 bb 文件(我已使用命令 bitbake my-image -c populate_sdk
构建 SDK)。
require recipes-extended/images/core-image-full-cmdline.bb
IMAGE_INSTALL_append = " \
emmy-w1-driver-sdiosdio \
emmy-w1-systemd \
eth-systemd \
can-systemd \
can-utils \
lighttpd \
dnsmasq \
parted \
swupdate \
swupdate-www \
u-boot-fw-utils \
linux-firmware-imx-sdma-imx6q \
"
TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules"
SDKIMAGE_FEATURES_append = " staticdev-pkgs"
这是上游 glibc 源中的一个问题:setcontext
的 ARM 汇编程序版本假定所有 PIC 代码都是动态链接的,这意味着如果 glibc 是在静态 PIE 模式下构建的,则静态链接失败(因为在不提供动态链接器代码的情况下激活 PIC。
您要么需要在没有静态 PIE 支持的情况下构建 glibc(我什至不知道这是 32 位 ARM 支持的配置),要么将 PIC
宏替换为 SHARED
sysdeps/unix/sysv/linux/arm/setcontext.S
.