linux - 交叉编译错误无法加载库 'libc.so.6'

标签 linux embedded-linux libc uclibc uclinux

我正在尝试实现一个将在 i386 Controller 上运行的动态库( liblog.so )。

当我在 Host Machine (Ubuntu Machine) 中编译它时它编译并生成 .so文件成功。liblog.so是放在/usr/lib下的文件在目标机器上。

merom@arunkumar:~/freedcs/freedcs-code1/Controller/src/Controller$ ldd log_client
    linux-gate.so.1 =>  (0xb7707000)
    libnative.so.3 => not found
    libxenomai.so.0 => not found
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb76cd000)
    librt.so.0 => not found
    liblog.so => /usr/lib/liblog.so (0xb76c9000)
    libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0xb751e000)
    libssl.so.1.0.0 => /lib/i386-linux-gnu/libssl.so.1.0.0 (0xb74c7000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb74a9000)
    libc.so.0 => not found
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb72f5000)
    /lib/ld-uClibc.so.0 => /lib/ld-linux.so.2 (0xb7708000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb72f0000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb72d7000)
merom@arunkumar:~/freedcs/freedcs-code1/Controller/src/Controller$ 

主机输出。

目标机器上的输出:
libnative.so.3 => /usr/lib/libnative.so.3 (0xb78d9000)
libxenomai.so.0 => /usr/lib/libxenomai.so.0 (0xb78d4000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb78c1000)
librt.so.0 => /lib/librt.so.0 (0xb78bd000)
liblog.so => /lib/liblog.so (0xb78b9000)
libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 (0xb7793000)
libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0xb7752000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7748000)
libc.so.0 => /lib/libc.so.0 (0xb770a000)
libdl.so.0 => /lib/libdl.so.0 (0xb7706000)
libc.so.6 => not found
ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0xb78e2000)

当我将它发送到目标机器(当前在 VMware 中)时,当我运行 .\log_client 时它显示 can't load library 'libc.so.6'是的,我编译了 log_client与链接 liblog.so
编译命令

正在生成 liblog.so
../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -c log.c -o liblog.o../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -Wcast-align -g -W -Wall -L../../../../build/i386/buildroot-2011.11/output/target/usr/lib -lxenomai -lpthread -lrt -shared -o liblog.so liblog.o -rdynamic -lcrypto -lssl
正在生成 log_client
cp liblog.so ../../../../build/i386/buildroot-2011.11/output/target/usr/lib../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -Wcast-align -g -W -Wall -c log_client.c../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -Wcast-align -g -W -Wall -L../../../../build/i386/buildroot-2011.11/output/target/usr/lib -lxenomai -lpthread -lrt -o log_client log_client.o -llog -rdynamic -lcrypto -lssl
我对正在运行的其他代码使用相同的过程,尽管该代码不使用此自定义库( liblog.so ),但也有警告,但我没有在此处发布。
请帮帮我,我很沮丧!!

------------ 已编辑 ----------
file输出
$ file liblog.so 
liblog.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

$ file log_client 
log_client: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

------------ 更新 ----------

有人建议我使用 --sysroot在编译文件时,但即使这样也没有帮助我。出来同样的错误。 :(

我已经放了 sysroot目标机器的 GCC 的 sysroot 路径的路径

正在生成 liblog.so
../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -Wcast-align -g -W -Wall -c log.c -o liblog.o --sysroot=/home/merom/freedcs/build/i386/buildroot-2011.11/output/host/usr/i686-unknown-linux-uclibc/sysroot/../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -Wcast-align -g -W -Wall -L../../../../build/i386/buildroot-2011.11/output/target/usr/lib -lxenomai -lpthread -lrt -shared -o liblog.so liblog.o -rdynamic -lcrypto -lssl --sysroot=/home/merom/freedcs/build/i386/buildroot-2011.11/output/host/usr/i686-unknown-linux-uclibc/sysroot/
正在生成 log_client
cp liblog.so ../../../../build/i386/buildroot-2011.11/output/target/usr/lib../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -Wcast-align -g -W -Wall -c log_client.c --sysroot=/home/merom/freedcs/build/i386/buildroot-2011.11/output/host/usr/i686-unknown-linux-uclibc/sysroot/../../../../build/i386/buildroot-2011.11/output/host/usr/bin/i686-unknown-linux-uclibc-gcc -Wcast-align -g -W -Wall -L../../../../build/i386/buildroot-2011.11/output/target/usr/lib -lxenomai -lpthread -lrt -o log_client log_client.o -llog -rdynamic -lcrypto -lssl --sysroot=/home/merom/freedcs/build/i386/buildroot-2011.11/output/host/usr/i686-unknown-linux-uclibc/sysroot/
更新

运行 objdump 之后 这是输出。
objdump -x log_client | grep NEEDED
NEEDED               libnative.so.3
NEEDED               libxenomai.so.0
NEEDED               libpthread.so.0
NEEDED               librt.so.0
NEEDED               liblog.so
NEEDED               libcrypto.so.1.0.0
NEEDED               libssl.so.1.0.0
NEEDED               libgcc_s.so.1
NEEDED               libc.so.0



objdump -x liblog.so | grep NEEDED
NEEDED               libnative.so.3
NEEDED               libxenomai.so.0
NEEDED               libpthread.so.0
NEEDED               librt.so.0
NEEDED               libcrypto.so.1.0.0
NEEDED               libssl.so.1.0.0
NEEDED               libgcc_s.so.1
NEEDED               libc.so.0

最佳答案

我对可执行文件有同样的问题。我尝试过的每个工具——ldd、objdump、readelf、strings——都表明依赖于 libc.so.0,而不是 .6。事实证明,它的一个依赖库依赖于 .6。所以我去解决了这个问题,现在一切正常。

该库版本错误,因为它是使用错误的交叉编译器编译的(我错误地使用了它),所以我重新编译并重新上传它。

关于linux - 交叉编译错误无法加载库 'libc.so.6',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23360502/

相关文章:

Java InetAddress.getByName &/etc/主机

c++ - 共享库、对象构造函数和 fork() 行为

ssh - 不能 SSH/SCP 到基于 Qemu 的 powerpc 虚拟机

linux - MACHINE_EXTRA_RDEPENDS 对比 MACHINE_ESSENTIAL_EXTRA_RDEPENDS

gcc -/lib/i386-linux-gnu/libc.so.6、/lib/x86_64-linux-gnu/libc.so.6 和/usr/lib/x86_64-linux-gnu/libc.so 有什么区别?

c - 寻找 `COMPILE_WPRINTF` 的定义

C 逐行读取文件

linux - gitlab 8.2.0 git 不工作

linux - 由于 401,无法执行 git pull

linux - 如何在uclinux中访问USB大容量存储设备...?