用C编写的应用程序,运行在Ubuntu 18。04上。
这个应用程序链接了几个共享库,比如shared_lib1_external。so
和shared_lib1_internal。so。
我有一个独特的场景,shared_lib1_external最初(在应用程序期间)被使用
因此,一些全局变量在shared_lib1_external中被初始化。< br / >
但是在启动完成后,需要使用shared_lib1_internal进行后续使用。
现在留给我们的是shared_lib1_internal,它没有正确初始化全局变量。
澄清一下,当我说全局符号时,我只对全局变量感兴趣
不是库中的全局函数。
例如:< br / >
Int global_counter = 0;
int global_array [10];
现在,在启动完成后,我确实有选项使用dlopen(打开shared_lib_external。so),然后使用dlsym(shared_lib_external的句柄“global_symbol_name”)来获取全局符号。
但这可能会很繁琐,因为有几个全局变量,但更重要的是,还有静态变量,它们是库的本地变量,但在启动时初始化,并在运行时使用。现在我们不能通过dlsym获得静态符号,这是另一个问题。< br / >
例如如下的静态变量:
静态int local_counter;
当我做一个对象转储:
objdump - t shared_lib1_internal。所以< br / >
静态符号和全局符号都会出现在。data部分的。bss (OR)中,这取决于变量是否被初始化。
所以问题是有一个程序化的方式来做下面的步骤在我的C应用程序:
应用程序启动完成后,C应用程序需要执行以下步骤:
Step1→检索shared_lib1_external的整个。bss和。data部分。到应用程序的内存中。< br / >
步骤2→将步骤1中检索到的整个。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。
你会注意到它依赖于很多其他东西,比如
矮。但是你可以
一定要完成你的目标。
我并不是要求你理解所有的binutils。这个想法是,你的应用程序可以使用objdump。c使用的相同api。
碰巧大部分是binutils api(与dlopen等api相比)。换句话说:
下载binutils源代码,验证您可以成功构建它。至少需要一些binutils头文件。
确保在你的Linux发行版上安装了binutils(这样你就可以根据需要在你自己的应用程序中使用binutils库)。
创建一个小小的c语言“hello world”,读取目标文件的。bss和。data部分,就像你希望你的应用程序做的那样。
成功构建并运行您的“hello world”。
最后,在你的应用程序中应用你所学到的方法。
好运!请把你发现的东西贴回来!