微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当 C 应用程序使用共享库时,是否可以检索该共享库的 bss 和 data 部分

如何解决当 C 应用程序使用共享库时,是否可以检索该共享库的 bss 和 data 部分

用 C 语言编写的应用程序,在 Ubuntu 18.04 上运行。
这个应用程序链接了几个共享库,比如 shared_lib1_external.so, 和 shared_lib1_internal.so

我有一个独特的场景,最初使用 shared_lib1_external(在应用程序期间) 启动),所以一些全局变量在这个 shared_lib1_external 中被初始化。
但是启动完成后,需要使用shared_lib1_internal进行后续使用。 现在这给我们留下了 shared_lib1_internal,它没有正确初始化全局变量

澄清一下,当我说全局符号时,我只对获取全局变量感兴趣, 不是库中的全局函数。 例如:
int global_counter = 0;
int global_array[10];

现在启动完成后,我可以选择使用 dlopen(打开 shared_lib_external.so),然后使用 dlsym(shared_lib_external 的句柄,“global_symbol_name”)来获取全局符号。
但这可能很乏味,因为有几个全局变量,但更重要的是,还有一些静态变量是库本地的,但在启动期间被初始化,并在运行时使用。现在我们无法通过dlsym获取静态符号,这是另一个问题。
例如,静态变量如下:
static int local_counter;

当我进行对象转储时:
objdump -t shared_lib1_internal.so,
静态符号和全局符号都显示在 .data 部分的 .bss (OR) 中,具体取决于变量是否已初始化。

那么问题是,是否有一种编程方式可以在我的 C 应用程序中执行以下步骤:
应用启动完成后,C应用要执行以下步骤:
Step1-> 将 shared_lib1_external.so 的整个 .bss 和 .data 部分检索到应用程序的内存中。
Step2-> 将 Step1 中检索到的整个 .bss 和 .data 部分复制到对应的
shared_lib1_internal.so 中的部分

解决方法

正如我上面所说:

强烈建议:“使用来源”。

下载“binutils”源代码,并适配objdump.c: ftp.gnu.org/gnu/binutils

这是 objdump.c: https://github.com/CyberGrandChallenge/binutils/blob/master/binutils/objdump.c

你会注意到它依赖于很多其他的东西,比如 DWARF。但是你可以 绝对实现您的目标。

我不是要您一定理解所有的 binutils。这个想法是您的应用程序可以使用 objdump.c 使用的相同 API。

碰巧主要是 binutils API(与 dlopen 等 API 相比)。换句话说:

  1. 下载binutils源码,验证是否可以成功构建。您至少需要一些 binutils 头文件。
  2. 确保您的 Linux 发行版上安装了 binutils(以便您可以根据需要在自己的应用中使用 binutils 库)。
  3. 创建一个小的 C 语言“hello world”来读取目标文件的 .bss 和 .data 部分,就像您希望您的应用一样。
  4. 成功构建并运行您的“hello world”。
  5. 最后,将您学到的知识应用到您的应用中。

祝你好运!请发回您找到的内容!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?