当前位置: 首页 > 面试题库 >

在Linux中,存根用于标准库。为什么需要存根?

西门山
2023-03-14
问题内容

在Linux中,为什么标准库需要存根?


问题答案:

需要存根以确保在各种Linux版本之间正确链接可执行文件,而无需构建目标文件。

例如:让a为我们正在构建的可执行文件:

gcc -o a test.o test1.o test2.o -lz

在上述情况下,可执行文件a依赖libz.so(-lz即与libz.so链接)。链接器使用LD_LIBRARY_PATH解析libz.so。

现在让我们看看问题所在:

In RHEL4(Linux Zseries):
objdump -T /usr/lib64/libz.so.1 | grep stack_chk

In RHEL5(Linux ZSeries);
objdump -T /usr/lib64/libz.so.1 | grep stack_chk

0000000000000000 DF UND 0000000000000031 GLIBC_2.4 __stack_chk_fail

在RHEL5中,我们在libz.so中看到一个未定义的符号。除非我们在上述命令中的lz之后将libc传递给链接器,否则无法解决。

存根:如果我们为libz.so生成存根,将libz.so的所有符号打包到存根库中,并与存根库而不是真实库链接,则不会看到任何错误:

修改后的链接行:

gcc -o a test.o test1.o test2.o -L/home/lib/stubs/ -lz

在/ home / lib / stubs目录中,我们有一个名为libzstub.so的libz.so存根库。

链接程序对链接命令中给出的路径的优先级高于LD_LIBRARY_PATH。

现在,即使我们在RHEL5版本中进行链接,链接器也会从/ home / lib / stubs目录中解析libz.so的符号。

在这里,我使用了盒子的配置细节。

加载程序负责在运行时加载核心响应函数。

RHEL5:

libcmpiutil-0.4-2.el5
glibc-utils-2.5-42
libc-client-2004g-2.2.1
libcap-1.10-26
libcap-1.10-26
libchewing-devel-0.3.0-8.el5
libchewing-0.3.0-8.el5
libcxgb3-1.2.3-1.el5
libcap-devel-1.10-26
glibc-common-2.5-42
libcxgb3-static-1.2.3-1.el5
libcroco-devel-0.6.1-2.1
compat-glibc-headers-2.3.4-2.26
libcroco-0.6.1-2.1
compat-libcom_err-1.0-7
libcmpiutil-devel-0.4-2.el5
compat-glibc-2.3.4-2.26
glibc-headers-2.5-42
glibc-devel-2.5-42
libcap-devel-1.10-26
libc-client-2004g-2.2.1
libcmpiutil-0.4-2.el5
libcroco-0.6.1-2.1
libc-client-devel-2004g-2.2.1
glibc-2.5-42
libchewing-devel-0.3.0-8.el5
libcroco-devel-0.6.1-2.1
compat-libcom_err-1.0-7
libc-client-devel-2004g-2.2.1
libchewing-0.3.0-8.el5
libcxgb3-1.2.3-1.el5
libcmpiutil-devel-0.4-2.el5
glibc-2.5-42
glibc-devel-2.5-42
compat-glibc-2.3.4-2.26

RHEL4:

rpm -qa | grep libc
glibc-2.3.4-2.41
libcxgb3-1.1.4-1.el4
libc-client-2002e-14
libcroco-0.6.0-4
libcap-devel-1.10-20
glibc-kernheaders-2.4-9.1.103.EL
compat-libcom_err-1.0-5
glibc-devel-2.3.4-2.41
compat-glibc-2.3.2-95.30
compat-libcom_err-1.0-5
glibc-common-2.3.4-2.41
libcroco-devel-0.6.0-4
libcxgb3-1.1.4-1.el4
libc-client-2002e-14
glibc-utils-2.3.4-2.41
libcap-1.10-20
glibc-headers-2.3.4-2.41
glibc-profile-2.3.4-2.41
libcxgb3-static-1.1.4-1.el4
glibc-devel-2.3.4-2.41
compat-glibc-2.3.2-95.30


 类似资料:
  • 问题内容: 我真的不明白为什么在核心类型链接中会在属性描述中说(例如,对于一个数字): store-设置为yes,将实际字段存储在索引中,否,则不存储它。默认为no(请注意, JSON文档本身已存储,可以从中检索 ) index-如果不应为该值建立索引,则设置为no。在这种情况下,应该将store设置为yes,因为如果未对它进行索引和存储, 则与它无关 这两个大胆的部分似乎矛盾。如果我仍然可以从源

  • 本文向大家介绍为什么要用 redis ?为什么要用缓存?相关面试题,主要包含被问及为什么要用 redis ?为什么要用缓存?时的应答技巧和注意事项,需要的朋友参考一下 主要从“高性能”和“高并发”这两点来看待这个问题。 高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓

  • 问题内容: 在64位系统上,Python中的整数占用24个字节。这是C语言中64位整数所需内存的3倍。现在,我知道这是因为Python整数是对象。但是,额外的内存又有什么用呢?我有我的猜测,但肯定会很高兴。 问题答案: 请记住,Python类型没有C那样有限的范围。唯一的限制是可用内存。 内存用于存储值,整数存储的当前大小(存储大小可变以支持任意大小)以及标准的Python对象簿记(对相关对象的引

  • 每当有人在这里询问关于的问题时,总会有一个相当笼统的回答:“C++就是这么做的,使用delete[]”。作为一个普通的C背景,我不明白为什么需要一个不同的调用。 使用/,您的选项是获取一个指向连续内存块的指针,并释放一个连续内存块。在实现land中会出现一些东西,并知道您根据基址分配的块的大小,以便在您必须释放它时使用。 没有函数。我看到过一些与此切线相关的其他问题的疯狂理论,比如调用只会释放数组

  • 我正在使用Bukkit API 1.8和Java7。 我有一个重复的任务,循环通过服务器上的所有玩家,并将他们的盔甲随机设置为皮革,链甲等... 当我使用、等方法时...我像往常一样更新他们的库存,但由于这个任务是每6滴答运行一次,它运行得很快。因此,当玩家试图发射弓时,每次此任务运行时弓都会重置其威力。 因为我知道更新库存有问题,所以我尝试删除方法。 我如何在保持任务运行的同时保持弓不重置? 我

  • 为什么mockito打电话为存根方法。 为什么它使一个实际调用func下当... then返回我已经检查了当做调试。