gpt4 book ai didi

c - ld.exe 找不到/lib/libc.so.6 即使在 sysroot 设置之后

转载 作者:行者123 更新时间:2023-12-05 04:25:41 27 4
gpt4 key购买 nike

我正在尝试使用 GTK 交叉编译一个简单的 C 程序对于 Windows 10 x86_64 上的 arm-linux-gnueabi,使用工具链和 sysroots provided by Linaro .

我在编译中使用的工具:

  • 构建套件: Cmake 3.23.2
  • 制作工具: Ninja 1.10.2
  • 构建工具链: Linaro GCC 5.5,如上所述
  • IDE:CLion 2022.2

我的交叉编译配置.cmake文件:

# User's variables
set(USER_CROSS_TOOLCHAIN_ROOT "D:/gcc")
set(USER_CROSS_SYSROOT "D:/sysroot")

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER "${USER_CROSS_TOOLCHAIN_ROOT}/bin/arm-linux-gnueabi-gcc.exe")
set(CMAKE_CXX_COMPILER "${USER_CROSS_TOOLCHAIN_ROOT}/bin/arm-linux-gnueabi-g++.exe")

set(CMAKE_FIND_ROOT_PATH "${USER_CROSS_TOOLCHAIN_ROOT}"
"${USER_CROSS_TOOLCHAIN_ROOT}/arm-linux-gnueabi"
)
set(CMAKE_SYSROOT "${USER_CROSS_SYSROOT}")


set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

如您所见,CMAKE_SYSROOT 在上面的文件中定义。

我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.23)
project(gtkHelloWorld C)

set(CMAKE_C_STANDARD 99)

link_directories(lib)

add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} PRIVATE libgtk-x11-2.0.so libgdk-x11-2.0.so libXrender.so libgdk_pixbuf-2.0.so libpangocairo-1.0.so libXdamage.so libXfixes.so libatk-1.0.so libpng16.so libxcb-shm.so libxcb-render.so libX11.so libgio-2.0.so libpangoft2-1.0.so libfontconfig.so libfreetype.so libz.so libexpat.so libffi.so libgmodule-2.0.so libgthread-2.0.so libglib-2.0.so)

path/to/arm-linux-gnueabi-gcc.exe -{PARAMETERS BELOW...} -print-search-dirs 打印(格式化):

...
Library:
d:/gcc/lib/gcc/arm-linux-gnueabi/5.5.0/
d:/gcc/lib/gcc/arm-linux-gnueabi/
d:/gcc/lib/gcc/
d:/gcc/arm-linux-gnueabi/lib/arm-linux-gnueabi/5.5.0/
d:/gcc/arm-linux-gnueabi/lib/arm-linux-gnueabi/
d:/gcc/arm-linux-gnueabi/lib/
D:/sysroot/lib/arm-linux-gnueabi/5.5.0/
D:/sysroot/lib/arm-linux-gnueabi/
D:/sysroot/lib/
D:/sysroot/usr/lib/arm-linux-gnueabi/5.5.0/
D:/sysroot/usr/lib/arm-linux-gnueabi/
D:/sysroot/usr/lib/

问题

在我尝试编译二进制文件之前一切都很好。

我遇到如下错误:

arm-linux-gnueabi/bin/ld.exe: cannot find /lib/libc.so.6
arm-linux-gnueabi/bin/ld.exe: cannot find /usr/lib/libc_nonshared.a
arm-linux-gnueabi/bin/ld.exe: cannot find /lib/ld-linux.so.3
collect2.exe: error: ld returned 1 exit status

重现错误的最小命令:

path/to/arm-linux-gnueabi-gcc.exe \

--sysroot=D:/sysroot \
-g CMakeFiles/gtkHelloWorld.dir/main.c.o \
-LD:/Code/gtkHelloWorld/lib \
-lgtk-x11-2.0 -lgdk-x11-2.0 -lXrender -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lXdamage -lXfixes -latk-1.0 -lpng16 -lxcb-shm -lxcb-render -lX11 -lgio-2.0 -lpangoft2-1.0 -lfontconfig -lfreetype -lz -lexpat -lffi -lgmodule-2.0 -lgthread-2.0 -lglib-2.0

-v 选项打印(格式化):

Using built-in specs.
COLLECT_GCC=D:\gcc\bin\arm-linux-gnueabi-gcc.exe
COLLECT_LTO_WRAPPER=d:/gcc/libexec/gcc/arm-linux-gnueabi/5.5.0/lto-wrapper.exe
Target: arm-linux-gnueabi
Configured with: ...

Thread model: posix
gcc version 5.5.0 (Linaro GCC 5.5-2017.10)
COMPILER_PATH=
d:/gcc/libexec/gcc/arm-linux-gnueabi/5.5.0/;
d:/gcc/libexec/gcc/arm-linux-gnueabi/;
d:/gcc/libexec/gcc/;
d:/gcc/arm-linux-gnueabi/bin/

LIBRARY_PATH=
d:/gcc/lib/gcc/arm-linux-gnueabi/5.5.0/;
d:/gcc/lib/gcc/arm-linux-gnueabi/;
d:/gcc/lib/gcc/;
d:/gcc/arm-linux-gnueabi/lib/;
D:/sysroot/lib/;
D:/sysroot/usr/lib/

COLLECT_GCC_OPTIONS='-g' '-LD:/Code/gtkHelloWorld/lib' '-v' '-march=armv7-a' '-mtune=cortex-a9' '-mfloat-abi=soft' '-mthumb' '-mtls-dialect=gnu'

d:/gcc/libexec/gcc/arm-linux-gnueabi/5.5.0/collect2.exe \
-plugin d:/gcc/libexec/gcc/arm-linux-gnueabi/5.5.0/liblto_plugin-0.dll \
-plugin-opt=d:/gcc/libexec/gcc/arm-linux-gnueabi/5.5.0/lto-wrapper.exe \
-plugin-opt=-fresolution=C:\Users\w568w\AppData\Local\Temp\ccWU1Lgv.res \
-plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s \
--sysroot=D:/sysroot \
--build-id --eh-frame-hdr \
-dynamic-linker /lib/ld-linux.so.3 \
-X -m armelf_linux_eabi D:/sysroot/usr/lib/crt1.o D:/sysroot/usr/lib/crti.o d:/gcc/lib/gcc/arm-linux-gnueabi/5.5.0/crtbegin.o \
-LD:/Code/gtkHelloWorld/lib \
-Ld:/gcc/lib/gcc/arm-linux-gnueabi/5.5.0 \
-Ld:/gcc/lib/gcc/arm-linux-gnueabi \
-Ld:/gcc/lib/gcc \
-Ld:/gcc/arm-linux-gnueabi/lib \
-LD:/sysroot/lib \
-LD:/sysroot/usr/lib \
CMakeFiles/gtkHelloWorld.dir/main.c.o \
-rpath D:/Code/gtkHelloWorld/lib \
-lgtk-x11-2.0 -lgdk-x11-2.0 -lXrender -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lXdamage -lXfixes -latk-1.0 -lpng16 -lxcb-shm -lxcb-render -lX11 -lgio-2.0 -lpangoft2-1.0 -lfontconfig -lfreetype -lz -lexpat -lffi -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_ \
--no-as-needed d:/gcc/lib/gcc/arm-linux-gnueabi/5.5.0/crtend.o D:/sysroot/usr/lib/crtn.o

(...A lot of "attempt to open" and "succeeded"...)

opened script file D:/Code/gtkHelloWorld/lib/libc.so
attempt to open /lib/libc.so.6 failed
attempt to open /usr/lib/libc_nonshared.a failed
attempt to open /lib/ld-linux.so.3 failed

d:/gcc/arm-linux-gnueabi/bin/ld.exe: cannot find /lib/libc.so.6
d:/gcc/arm-linux-gnueabi/bin/ld.exe: cannot find /usr/lib/libc_nonshared.a
d:/gcc/arm-linux-gnueabi/bin/ld.exe: cannot find /lib/ld-linux.so.3

collect2.exe: error: ld returned 1 exit status

上面输出中出现的文件,D:/Code/gtkHelloWorld/lib/libc.so是:

/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) )

让我感到困惑的是,我能找到的所有答案都告诉我添加 --sysroot=(或 -Wl,--sysroot=),我从一开始就这样做了。

此外,我可以确认这三个 .so 文件确实存在于 {SYS_ROOT}/lib{SYS_ROOT}/usr/lib.

我想链接器确实注意到了sysroot,因为从命令中删除--sysroot=会产生另一个错误提示 >找不到 crt1.o

我试过但失败的答案

  1. cannot find /lib/libc.so.6 even after setting sysroot : 在--sysroot
  2. 前添加 -Wl
  3. Cannot find /lib/libc.so.6 : 添加--sysroot
  4. cannot find /lib64/libc.so.6 : 同样的情况,还是没有答案

最佳答案

感谢@n-1-8e9-wheres-my-share-m 和@infinitezero 就如何调试此问题提供建议。现在我可以自己回答了。

关键是 ld.exe 并不总是跟在 SYS_ROOT 之后或将其视为虚拟文件系统根。

它可以作为包含一整套头文件和库的快捷方式(通常在进行交叉编译时很有用)。 documentation说:

--sysroot=dir

Use dir as the logical root directory for headers and libraries. For example, if the compiler normally searches for headers in /usr/include and libraries in /usr/lib, it instead searches dir/usr/include and dir/usr/lib.

但该文档省略了一些特殊规则。正如所讨论的here ,

You misunderstand GNU ld's --sysroot rule, which is applicable in these two cases:

  • when a path begins with = or $SYSROOT
  • (Only) in case a sysroot prefix is configured, and the filename starts withthe ‘/’ character, and the script being processed was located insidethe sysroot prefix, the filename will be looked for in the sysrootprefix.

否则,ld查看脚本中定义的绝对路径(/lib/xxx),而不是 {SYS_ROOT}/lib/xxx.

所以快速解决我的问题的方法是将项目中的 ld 脚本 gtkHelloWorld/lib/libc.so 更改为

/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( =/lib/libc.so.6 =/usr/lib/libc_nonshared.a AS_NEEDED ( =/lib/ld-linux.so.3 ) )

然后正常编译。

引用: 对于那些想要探索更多关于 ld 脚本的人,this是一个全面的文档。

关于c - ld.exe 找不到/lib/libc.so.6 即使在 sysroot 设置之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73180710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com