当C应用程序使用共享库时,是否有可能检索该共享库的bss和数据部分

2022-01-24 23:32:14 标签 linuxshareddlsym

用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”。

最后,在你的应用程序中应用你所学到的方法。

好运!请把你发现的东西贴回来!

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码