面试 | Linux 下的动态链接库问题

面试 | Linux 下的动态链接库问题,第1张

在 Linux 开发时,我们经常会看到一些形如 xxx.so 的名称出现,其中 so 是 Shared Object 的缩写,即可以共享的目标文件,也就是我们所称为的动态链接库,和在 Windows 下大家玩 游戏 时遇到的 xxx.dll 错误中的文件是一个类型的。

面试中经常会问到以下问题:

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被 *** 作系统载入内存执行。

库有两种:

在一个程序的编译过程中,分为以下几个步骤: 预处理 编译 汇编 链接 。本文中讨论的链接库就是针对最后一个步骤「链接」而言的。

动态库和静态库的区别

左图为静态链接库,右图为动态链接库

对于静态链接库而言在链接阶段,会将汇编生成的「目标文件.o」与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接:

静态链接可以理解为最后生成了一个「单文件免安装绿色版」的程序,优点在于移植的时候只需要移动这一个文件,缺点在于文件体积非常大,为了解决这样的问题,就有了动态链接库。动态链接库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。

动态库连接到系统空间,如果多个程序连接了同一个库,那么只需要一份,优点在于编译程序的时候不会将对应的库文件全部打包在生成的程序中,而是保留了到对应库的链接,缺点就是移植的时候如果只移动了对应的程序没有安装相关的库的话,就会看到类似以下喜闻乐见的结果了。

在 Linux 下一个动态库有y三个不同名字的文件组成:

当程序在内部列出所需要的链接库时,仅仅使用 soname。当你创建一个链接库时,使用 real name。安装一个新的链接库时,把它复制到一个DLL文件夹里,然后运行程序 ldconfig。ldconfig 检查存在的 real name 文件,并且创建指向它符号链接 soname 文件。可能大家比较常见到的有 libsodium 等。

有了上面关于库的一些基础知识之后,我们可以开始尝试创建一个动态库来供程序使用了。

比如我们有一个求最大值的函数 max(int a,int b,int c) ,放在文件 max.c 中文件内容如下:

可以通过:

将其编译为共享库,-fPIC是编译选项,PIC是 Position Independent Code 的缩写,表示要生成位置无关的代码,这是动态库需要的特性; -shared是链接选项,告诉 gcc 生成动态库而不是可执行文件。为了让用户知道我们的动态库中有哪些接口可用,我们需要编写对应的头文件,比如可以写一个 max.h :

设置一个驱动函数来测试我们编写的动态库:

通过 gcc test.c -L. -lmax来生成 a.out,其中-lmax表示要链接 libmax.so,-L.表示搜索要链接的库文件时包含当前路径。

但是这样直接运行的话,会出现一个错误:

由于 Linux 是通过/etc/ld.so.cache文件搜寻要链接的动态库的,而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的,本次使用的动态库 libmax.so 并不在对应的目录下,就会导致程序无法找到对应的动态链接库,这样我们的解决方法有二:

小结

​动态链接库是各个系统中的一个重要的组成部分且在 Linux 开发相关领域中尤为重要,也是一个面试的高频考点,除了动态链接库以外,还有以下相关知识也是高频考点,在面试前一定要准备好:

本文作者:Nova Kwok

1.A

2.B

3.A

4.D

5.B

6.atq是列举at的quere,atrm不记得有没有这个..可能是A或B

7.A

8.D

9.C

10.B

1.rpm -qa 查询rpm包关联文件名

rpm -ql 查询rpm包所有文件内容

rpm -ivh 安装rpm包

rpm -Uvh 更新安装

2.首先U盘得是fat/fat16/fat32格式.

dmesg 查询新入设备名

dmesg | grep 'sd*'

假设查出是/dev/sdb

则mount /dev/sdb /mnt

cd /mnt

ls 即可查看到U盘文件内容

3.swap 即交换分区,具体怎么说我难解释,可以理解为Windows的虚拟内存.

swap 应该设置为内存同样大小

4.GPL协议..网上抄吧

5.安装方式

按媒介分:光盘安装/网络安装

按安装方法分:普通安装/无人值守安装(利用脚本设置安装)

6.这个..太多了吧..

可以答上一大堆..

这个应该不是什么面试题吧,应该是考试题,面试题一般不会这么简单.

软硬件的基础知识一定要扎实,比方中断的原理,串口通信的原理什么的。。。

最重要的还是你自己在这一年中做过什么,把你自己做过的东西讲清楚的话,

一般人家HR就能判断你这个人到底肚子里是不是有真材实货,不要像很多

华而不实的人一样,自己什么代码都没写过的项目也往简历里面凑,这样没好处。

至于薪水,我们相信做驱动开发的工作永远也不会差,关键还是得能在工作

中出成绩才能对得起人家的高薪水。另外除了薪水之外,公司能具有的工作学习

气氛更加重要,毕竟,你也只有一年的工作经验,还是处于经验的积累期。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

杭州巨立安技术(JulianTec),专注于提供Linux相关的项目研发和技术培训服务。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/6082199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存