- 主题:Re: gcc/c如何获取某个obj模块中某个段的起点地址?
map文件里都有啊, 那几个符号, sbss, ebss, sdata, edata什么的
在程序里extern int _sbss;
然后&_sbss就是你要的地址
【 在 feiy (null) 的大作中提到: 】
对工程完成编译链接后,在map文件可以查看到,每个obj(模块)内部所被分配的bss rodata等等的起始地址就都确定了,而且通过指针可以正常访问这些地址内存的内容。
那么请教,在C代码里,如何来获取这些具体到某个obj的某个段的起始地址? 比如,我想获取 a.o这个模块(来自工程的a.c)中bss被分配的起始地址,改如何写C代码?
(注:不是问获取整个工程的总段的起始地址,而是请教,如何在C代码里获取某个obj里的某个段所被分配的起始地址,在map文件里可以看到的那个地址)
谢谢!
--
FROM 45.66.157.*
哦, 是要具体某个obj里的bss...
把你这个源文件的全局变量全部包到一个struct里不就完了, 我一直这么干
【 在 feiy (null) 的大作中提到: 】
: 对工程完成编译链接后,在map文件可以查看到,每个obj(模块)内部所被分配的bss rodata等等的起始地址就都确定了,而且通过指针可以正常访问这些地址内存的内容。
: 那么请教,在C代码里,如何来获取这些具体到某个obj的某个段的起始地址? 比如,我想获取 a.o这个模块(来自工程的a.c)中bss被分配的起始地址,改如何写C代码?
: (注:不是问获取整个工程的总段的起始地址,而是请教,如何在C代码里获取某个obj里的某个段所被分配的起始地址,在map文件里可以看到的那个地址)
: ...................
--
修改:tom6bj FROM 45.66.157.*
FROM 45.66.157.*
内部静态变量不是固定初始化为零么?
【 在 feiy (null) 的大作中提到: 】
能这么干,早就这么干了。我的目的是,给你一个现成的(外来)封装包(库),也就是说,你没法改人家的封装包库了。这个封装包里由多个obj模块组成,想获取其中某个obj所分配的bss段的起始地址。
找了好多办法,尝试了好多方式,都不行,只要人家封装包里没有对这个单独的obj定义段,如果多个obj使用的是通用的段名定义,那就没招。
不过后来突然想到,既然LD文件可以对每个封装文件(大多数是我们常数的库文件)指定段基地址,而gcc本身是支持从库里提取obj也就是说,也就是说,可以把期待的obj文件给拆出来做成一个单独的封装库,然后对这个在LD文件里进行处理,就可以实现目的了。 所以,绕了个弯子给解决了。
我也是没办法,国内某厂商提供的库文件,存在一个稳定性问题的bug,后来分析发现,是某子模块内部的一个内部静态变量没有初始化造成的(讲一声粗话kao),又没有提供对外的接口,只好采取这种暴力的方法了。
【 在 tom6bj 的大作中提到: 】
: 哦, 是要具体某个obj里的bss...
: 把你这个源文件的全局变量全部包到一个struct里不就完了, 我一直这么干
:
--
FROM 98.126.12.*