栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【交叉编译】linux c文件生成so文件并调用示例

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【交叉编译】linux c文件生成so文件并调用示例

1. 搭建测试环境

将test1(参考linux c文件生成so文件并调用示例)文件夹中的add.c,add.h,main.c复制到test3文件夹中,文件列表如下:

luo@luo-desktop:~/test3$ ls
add.c  add.h  main.c
2. 交叉编译

执行以下命令,交叉编译add.c文件为libadd.so文件:

luo@luo-desktop:~/test3$ arm-linux-gnueabihf-gcc add.c -fPIC -shared -o libadd.so
luo@luo-desktop:~/test3$ ls
add.c  add.h  libadd.so
luo@luo-desktop:~/test3$ file libadd.so 
libadd.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=82c8a79ce0e4ecd1b9564000ccd2473294286cf8, with debug_info, not stripped

执行以下命令,交叉编译main.c文件为main可执行文件:

luo@luo-desktop:~/test3$ arm-linux-gnueabihf-gcc main.c -L. -ladd -o main
luo@luo-desktop:~/test3$ ls
add.c  add.h  libadd.so  main  main.c
luo@luo-desktop:~/test3$ file main
main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=7e00631b728338509951f8f06c29e4a09a9de6ef, with debug_info, not stripped
3. 推送至开发板运行测试

将main,libadd.so,文件推送到开发板/root目录,然后执行以下命令测试:

root@sipeed:~$ ls
libadd.so  main
root@sipeed:~$ ./main
/bin/sh: ./main: not found

发现运行不了。执行以下命令查找原因:

root@sipeed:~$ ldd main 
	/lib/ld-linux-armhf.so.3 (0xb6f2f000)
Error loading shared library libadd.so: No such file or directory (needed by main)
	libc.so.6 => /lib/ld-linux-armhf.so.3 (0xb6f2f000)
Error relocating main: add: symbol not found

指示找不到libadd.so文件,那将该文件路径加入LD_LIBRARY_PATH变量,继续测试:

root@sipeed:~$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
root@sipeed:~$ ldd main 
	/lib/ld-linux-armhf.so.3 (0xb6f0b000)
	libadd.so => /root/libadd.so (0xb6efa000)
	libc.so.6 => /lib/ld-linux-armhf.so.3 (0xb6f0b000)
root@sipeed:~$ ./main
/bin/sh: ./main: not found

这下能找到libadd.so文件了,但还是不行。继续查找原因,发现/lib/ld-linux-armhf.so.3这个文件也没有:

root@sipeed:~$ ls /lib/ld-linux-armhf.so.3
ls: /lib/ld-linux-armhf.so.3: No such file or directory

于是去ubuntu系统中找,结果在交叉编译链的目录中找到了这个文件:

luo@luo-desktop:/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf$ find -name ld-linux-armhf*
./arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3

然后把这个文件推送到开发板的/lib目录下,继续测试:

root@sipeed:~$ ls /lib/ld-linux-armhf.so.3
/lib/ld-linux-armhf.so.3
root@sipeed:~$ ./main
./main: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

报错说每找到libc.so.6这个文件,这应该是个链接文件,链接到ld-linux-armhf.so.3文件上,所以尝试在/lib目录下新建libc.so.6文件指向ld-linux-armhf.so.3:

root@sipeed:~$ ln -s /lib/ld-linux-armhf.so.3 /lib/libc.so.6
root@sipeed:~$ ll /lib/libc.so.6 
lrwxrwxrwx    1 root     root            24 Jan 10 03:41 /lib/libc.so.6 -> /lib/ld-linux-armhf.so.3
root@sipeed:~$ ./main
./main: relocation error: libadd.so: symbol __cxa_finalize, version GLIBC_2.4 not defined in file libc.so.6 with link time reference

结果还是报错。最终确定原因是交叉编译工具链导致的,解决办法就是使用开发板官方提供的交叉编译工具链进行编译。最后运行成功:

root@sipeed:~$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
root@sipeed:~$./main
hello world 3 
root@sipeed:~$ ldd main
/lib/ld-musl-armhf.so.1 (0xb6f03000)
libadd.so => /root/libadd.so (0xb6ef2000)	
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6ed8000)	libc.so => /lib/ld-musl-armhf.so.1 (0xb6f03000)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/277637.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号