加载器如何引用共享库中的变量?

2024-05-08

我现在了解如何通过过程链接表引用动态函数,如下所示:

Dump of assembler code for function foo@plt:
0x0000000000400528 <foo@plt+0>: jmpq   *0x2004d2(%rip)        # 0x600a00 <_GLOBAL_OFFSET_TABLE_+40>
0x000000000040052e <foo@plt+6>: pushq  $0x2
0x0000000000400533 <foo@plt+11>:    jmpq   0x4004f8
(gdb) disas 0x4004f8
No function contains specified address.

但我不知道动态变量是如何引用的,虽然我发现启动后值就填充在GOT中,但是没有像上面那样的存根,它是如何工作的?


动态加载器在将控制权转移到用户程序之前重新定位对变量的所有引用。

它们没有“存根”,因为一旦用户程序开始执行,加载程序就不可能重新获得控制权并更新变量地址。如果您不清楚这一点,那么您还没有really了解 PLT 延迟解析存根的工作原理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加载器如何引用共享库中的变量? 的相关文章

  • 如何调查 imp.load_module 上的 python2 段错误

    我正在尝试安装和使用dolfin https aur archlinux org packages dolfin bzr 在 Arch Linux 上 使用 Python 2 7 3 找出导致分段的原因的最佳方法是什么 诸如此类的故障 py
  • 将ELF文件加载到内存中

    我正在尝试将 elf 文件放入内存然后执行它 步骤如下 1 要放入内存的文件 int main printf Hello world n return 0 2 编译它gcc o hello hello c static ELF Header
  • 如何知道程序调用了库的哪些函数

    假设我有二进制库 so 和使用该库的二进制程序 即我不拥有其中任何一个的源代码 如何找出在运行时调用了哪些库函数 我想知道他们的名字 但不需要实时信息 这两个二进制文件都不包含调试符号 The objdump https sourcewar
  • ldd 输出静态链接到共享库

    我正在尝试创建一个共享库 libddv3djava so 我编译 libddv3djava so 的源代码 如下所示 Programming intellijprojects ddv3dbindingstest src g c Wall W
  • intellij idea看不到java 9标准类

    我有一个maven使用的项目Java 9 它导入到IntelliJ IDEA 2017 2 3 Community 但由于某种原因它找不到标准的java类 例如String or Float 例如 当我尝试Setup Project JDK
  • 静态库 (.a) 和共享库 (.so) 之间的文件格式差异?

    我知道关于共享库和静态库的用例有很多问题 这个问题与此无关 我问的是磁盘上存储的文件格式的差异 为什么问题是 两者之间有什么区别 或者它们完全相同 只是用途不同 我相信它们是不一样的 因为在共享库上运行 nm 需要 D 标志 显然它需要做一
  • 为什么有些程序需要 .lib 和 .dll 才能运行

    当我要设置我的开发环境时 SDLSimple DirectMediaLayer 我下载了网站提供的包 从readme txt文件我发现我需要两者 lib and dll 我的问题是 我不确定我的理解是否正确 在我看来 lib for win
  • 分发Windows C++库:如何决定是创建静态库还是动态库?

    我们一直在将 Java 和 NET API 库转换为 C 并试图找出将编译版本分发给其他开发人员以与他们的自定义应用程序一起使用的最佳方法 应该是静态库还是动态库 我们需要为 Win32 和 Win64 创建 我想每个目标操作系统都有调试版
  • 在 Mac osx 中将 .a 转换为 .dylib

    是否可以在 Mac osx 中将 a 文件转换为 dylib 文件 我目前有libraryname a 它似乎无法将其包含在我的程序中 因为仅包含 dylib 库 还有一个命令可以通过 mac osx 终端显示程序中使用的静态库吗 是的 这
  • 在 os x 上编译 libuv 的库?

    我正在尝试学习一些 libuv 似乎有一本很棒的书介绍了它 然而 这本书并没有解释如何实际编译它 我对从 github 中提取的代码运行 make 并按照 github 上的描述使用 GYP 进行编译 https github com jo
  • 符号查找错误未定义符号,但所有符号似乎都存在

    可执行文件似乎无法解析链接库中的符号 LD DEBUG libs 的相关输出表明加载了正确的库 6557 usr lib libcharon so 0 error symbol lookup error undefined symbol a
  • gcc 4.5 中在链接方面引入的更改?

    我有一个项目生成一个共享库 该库与另一个共享库链接 当我用 gcc 4 4 编译并链接它时 一切正常 没有编译时警告或错误 没有链接时间警告或错误并且 ldd libmyproject so正确报告与其他共享库的依赖关系 另一方面 当我用
  • 指定共享对象(共享库)的名称

    Go 编译器为共享对象生成的名称是错误的 例子 go install buildmode shared linkshared github com apache thrift lib go thrift code google com p
  • 调用程序中对库类成员的未定义引用错误

    下面添加了其他问题 2011 年 4 月 11 日 我正在用 C 开发一组跨平台的共享库 DLL Sos 和测试程序 尽管我必须能够支持 C 这些库将仅作为目标代码发布 但测试程序将随源代码一起发布 因此我们的客户可以获得示例代码 因此 我
  • 无关的库链接

    我有一个可能有点愚蠢的问题 因为我很确定我可能已经知道答案了 假设你有静态库A 动态共享库B和你的linux下的程序C 假设库 A 调用库 B 中的函数 并且您的程序调用库 A 中的函数 现在假设 C 在 A 中调用的所有函数都不使用 B
  • 如何在Android studio中调用.so库上的方法

    编辑 请参阅我的第一个答案 我想在我的项目中使用 android 串口 api 我这样做有很多麻烦 关于如何配置旧版本的 gradle 或如何使用 NDK 进行编译 存在大量相互冲突的信息 而这两者都没有用 我完全迷失了 我发现唯一可能正确
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 共享 Netbeans 项目

    我有一个在 Netbeans 中开发的 java 项目 因为我是唯一的开发人员 而且这是一个简单的项目 一个源文件 但它需要几个专业库 所以我没有使用源代码控制 我将不再参与该项目 并希望将其交给其他人 以防他们将来需要对其进行更改 我认为
  • 使用 Gradle 在多个 Android 应用程序之间共享 Android 库

    我有 Android 应用程序 A 和 B 我想将每个应用程序中的重复代码提取到共享库 L 中 如何使用 Gradle 执行此操作 我之前见过这个问题的一些排列 但答案很少 最接近 最好的已问问题是这个 多个 Android 应用程序依赖于
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c

随机推荐