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

问题描述 投票:0回答:1

用 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 全局计数器 = 0;
int 全局数组[10];

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

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

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

linux shared dlsym
1个回答
1
投票

正如我上面所说:

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

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

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

你会注意到它依赖于很多其他东西,比如 矮人。但是你可以 绝对完成你的目标。

我并不是要求您一定要理解所有 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. 最后,应用您所学到的知识在您的应用程序中执行相同的操作。
© www.soinside.com 2019 - 2024. All rights reserved.