首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交叉编译错误无法加载库'libc.so.6‘

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

Stack Overflow用户
提问于 2014-04-29 09:17:38
回答 1查看 6.8K关注 0票数 4

我正在尝试实现一个动态库(liblog.so),它将在i386控制器上运行。

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

代码语言:javascript
复制
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$ 

主机输出。

目标机器的输出:

代码语言:javascript
复制
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'是的,我用liblog.so链接编译了log_client

编译命令

生成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),但也有警告,但我没有在这里发布。请帮帮我,我很沮丧!!

------------Edited

file输出

代码语言:javascript
复制
$ 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

------------Update

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

sysroot I将 path放入目标机器的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之后,这就是输出。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2015-10-01 10:35:55

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23360502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档