一步步完善rootfs:4.配置动态链接库

本文深入探讨了嵌入式Linux环境下动态链接库的作用、查找、拷贝及优化方法,通过具体实例展示了如何创建并编译使用动态链接库的程序。

一、动态链接库作用

编译程序可分为动态编译和静态编译,静态编译出来的可执行程序大小相比较于动态编译是很大的,所以为了缩小程序所占的资源,一般使用动态编译,动态编译的程序在运行时会依赖动态链接库去执行,动态链接库会提供API给程序调用。

二、查找动态链接库

动态链接库位置在交叉编译工具链下面,可以使用find命令进行查找,如下图所示,我的动态链接库就在./arm-none-linux-gnueabi/libc/lib目录下,截图的下方还包含了很多查找到的内容,要自己去分辨一下。不同的编译工具,链接库的位置是不一样的。

三、拷贝动态链接库

root@ubuntu:/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib# cp *so* /root/rootfs_zht/rootfs/lib/ -rdf

动态链接库下面有好多是链接文件,所以执行cp的时候注意加上-rdf选项,操作执行完之后进入开发板就可以看到如下图所示:

四、缩小链接库体积

动态链接库so文件中包含了调试信息,这些调试信息在程序运行时是没用的,并且这些符号会占用一定空间,在传统的嵌入式系统中flash空间是有限的,所以为了节省空间常常把这些调试信息去掉。
去掉调试信息的命令如下,arm-linux-strip命令要看你的交叉编译工具链,不是固定的名称。

root@ubuntu:~/rootfs_zht/rootfs# arm-linux-strip lib/*so*

五、测试程序

我在ubuntu中(nfs挂载rootfs)创建文件夹、写代码、编译的过程如下:

root@ubuntu:~/rootfs_zht/rootfs# ls
bin  dev  etc  lib  linuxrc  proc  root  sbin  sys  tmp  usr  var
root@ubuntu:~/rootfs_zht/rootfs# mkdir test
root@ubuntu:~/rootfs_zht/rootfs# cd test
root@ubuntu:~/rootfs_zht/rootfs/test# vi hello.c
root@ubuntu:~/rootfs_zht/rootfs/test# vi Makefile
root@ubuntu:~/rootfs_zht/rootfs/test# make
arm-linux-gcc hello.c -o hello_dynamic
arm-linux-gcc hello.c -o hello_static -static
root@ubuntu:~/rootfs_zht/rootfs/test# ls
hello.c  hello_dynamic  hello_static  Makefile
root@ubuntu:~/rootfs_zht/rootfs/test# 

hello.c的内容:

#include <stdio.h>

void main()
{
        printf("hello world.\n");
}

Makefile的内容:

all:
        arm-linux-gcc hello.c -o hello_dynamic
        arm-linux-gcc hello.c -o hello_static -static

clean:
        rm hello_dynamic hello_static

开发板上执行的结果:


参考资料: 朱老师嵌入式Linux

### 问题分析与解决方案 在使用 `tar -xf rootfs.tar.gz` 命令解压文件时,现 `Cannot open: No such file or directory` 错误的原因通常与以下因素有关:文件路径错误、文件不存在或权限不足。以下是针对该问题的详细分析和解决方案。 #### 1. 文件路径错误 确保当前目录下确实存在 `rootfs.tar.gz` 文件。可以通过以下命令检查: ```bash ls -l rootfs.tar.gz ``` 如果文件不存在,则需要确认文件的实际位置,并切换到正确的目录或指定完整路径[^1]。 #### 2. 文件名拼写错误 检查文件名是否正确。例如,文件可能是 `rootfs.tar` 而非 `rootfs.tar.gz`。可以使用以下命令列所有 `.tar` 或 `.gz` 文件: ```bash ls *.tar *.gz ``` #### 3. 权限不足 即使文件存在,也可能由于权限不足导致无法访问。可以通过以下命令检查文件权限: ```bash ls -l rootfs.tar.gz ``` 如果权限不足,可以使用 `chmod` 命令更改文件权限: ```bash chmod 644 rootfs.tar.gz ``` #### 4. 文件损坏 如果文件已损坏,`tar` 命令可能无法打开它。可以尝试验证文件完整性: ```bash gzip -t rootfs.tar.gz ``` 如果文件损坏,需重新下载或获取正确的压缩包[^2]。 #### 5. 使用绝对路径 如果不确定当前目录是否正确,可以使用文件的绝对路径执行解压命令。例如: ```bash tar -xf /path/to/rootfs.tar.gz ``` #### 6. 检查 tar 工具版本 某些旧版本的 `tar` 工具可能不支持特定的压缩格式。可以通过以下命令检查 `tar` 版本: ```bash tar --version ``` 如果版本过旧,建议更新 `tar` 工具[^3]。 --- ### 示例代码 以下是一个完整的解压操作示例,包含权限检查和路径验证: ```bash # 检查文件是否存在 if [ ! -f "rootfs.tar.gz" ]; then echo "Error: File 'rootfs.tar.gz' not found." exit 1 fi # 检查文件权限 if [ ! -r "rootfs.tar.gz" ]; then echo "Error: File 'rootfs.tar.gz' is not readable." chmod 644 rootfs.tar.gz fi # 解压文件 tar -xf rootfs.tar.gz ``` --- ### 总结 通过以上方法,可以有效解决 `tar -xf rootfs.tar.gz Cannot open No such file or directory` 的问题。确保文件路径正确、文件存在、权限充足且工具版本兼容是关键步骤[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值