交叉编译可执行文件无法解析符号 pthread_create

标签 c mips cross-compiling

我编译最新的 buildroot,并使用输出主机 mipsel-linux-gcc 来编译我的 c 程序。我已经测试了 hello world 程序,它在 MIPS 机器上运行良好(实际上是一个用 padavan 刷新的路由器)。然后我编译了我的程序,它运行良好,它调用了 pthread_create,表明它无法解析符号 pthread_create

我想可能是因为路由器没有libpthread.so,所以我查了一下:

[RT-AC54U /home/root]# find / -name "*pthread*"
/lib/libpthread-0.9.33.2.so
/lib/libpthread.so.0

事实证明 libpthread so 文件确实存在。

然后我怀疑可能是交叉编译设置引起的。所以我通过添加 -L 来检查链接库。 -Wl,--verbose 选项(从其他 SO 帖子中学习)并找到:

attempt to open buildroot/output/host/usr/mipsel-buildroot-linux-uclibc/sysroot/usr/
lib/libpthread.a succeeded

链接时,链接器只找到libpthread.a,所有libpthread.so搜索失败。看到这一点,我使用 find 进行了检查。 -在 buildroot 目录中命名为“*pthread.so”,但什么也找不到。

如果链接器只找到 pthread 静态库那么它为什么不提示?我浏览了 make menuconfig,没有看到任何关于 pthread 库的选项。

readelf 的输出是:

readelf -d ./myprogram |grep NEEDED
0x00000001 (NEEDED)                     Shared library: [libc.so.0]

我们可以看到该程序不包含对libpthread 的需求!与native(x64) gcc编译的同一个程序对比:

readelf -d ./myprogram |grep NEEDED
0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

我现在最好的猜测是 mipsel-linux-gcc 找不到 libpthread.so ,因此没有将有关 libpthread 的信息添加到可执行文件中。奇怪的是它根本没有提示。

谁能告诉我这是怎么回事?谢谢。

最佳答案

尝试在编译命令中加入-lpthread

例如:

gcc <source file>.c -o <object file name> -lpthread

gcc 是编译命令。

-lpthread 是执行pthread.h库文件的选项。

关于交叉编译可执行文件无法解析符号 pthread_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42591209/

相关文章:

android - dlopen 失败 : cannot locate symbol "__cxa_finalize" referenced by "/system/lib/libdl.so"

c++ - 使用 cmake 交叉编译 gRPC

c - fork() 之后地址、值和指针会发生什么

c - 想要打印字符串的所有旋转

java - 使用 TCP 在 Java(Android 客户端)和 C(PC 服务器 - Linux)之间传输文件

c - 为什么预处理器不扩展代码中稍后定义的类型

堆栈指针/程序计数器错误 MIP

c++ - MIPS 模拟器 --- 将指令读入内存 (C++)

assembly - 对于已知常量 AND 掩码,仅使用移位和旋转进行逻辑 AND

rust - 交叉编译到 armv5te 时整数格式不正确