- 主题:Re: gcc/c如何获取某个obj模块中某个段的起点地址?
模块里全局变量放一个大结构体,然后就得到了
记忆中,ld脚本没显式导出的东西,用户程序看不到
【 在 feiy (null) 的大作中提到: 】
: 对工程完成编译链接后,在map文件可以查看到,每个obj(模块)内部所被分配的bss rodata等等的起始地址就都确定了,而且通过指针可以正常访问这些地址内存的内容。
: 那么请教,在C代码里,如何来获取这些具体到某个obj的某个段的起始地址? 比如,我想获取 a.o这个模块(来自工程的a.c)中bss被分配的起始地址,改如何写C代码?
: (注:不是问获取整个工程的总段的起始地址,而是请教,如何在C代码里获取某个obj里的某个段所被分配的起始地址,在map文件里可以看到的那个地址)
: ...................
--
FROM 123.118.96.*
package里的module 是个啥?C有这个概念吗?
你这个需求可以自己写链接脚本,在里面你需要的位置插入导出label。
【 在 feiy 的大作中提到: 】
: 若非模块文件里被static的变量数据区(例如你所说的全局变量),那么外部直接用extern就可以访问了,或者说,如果也可以随便改代码(你懂的),那我就不来请教了 :-)
: 在ld里可以指定一个package的bss被放置的位置,但是我怎么尝试,都无法成功地将一个package里的module的bss段指定位置。
:
--
FROM 39.144.35.*
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.*
直接定义一个变量,类似extern int * const BSS_START_A_O;
然后linking时让linker创建这个变量并赋值成A.o BSS起始地址。
【 在 feiy 的大作中提到: 】
: 对工程完成编译链接后,在map文件可以查看到,每个obj(模块)内部所被分配的bss rodata等等的起始地址就都确定了,而且通过指针可以正常访问这些地址内存的内容。
: 那么请教,在C代码里,如何来获取这些具体到某个obj的某个段的起始地址? 比如,我想获取 a.o这个模块(来自工程的a.c)中bss被分配的起始地址,改如何写C代码?
: (注:不是问获取整个工程的总段的起始地址,而是请教,如何在C代码里获取某个obj里的某个段所被分配的起始地址,在map文件里可以看到的那个地址)
: ...................
--
FROM 213.95.148.*
内部静态变量不是固定初始化为零么?
【 在 feiy (null) 的大作中提到: 】
能这么干,早就这么干了。我的目的是,给你一个现成的(外来)封装包(库),也就是说,你没法改人家的封装包库了。这个封装包里由多个obj模块组成,想获取其中某个obj所分配的bss段的起始地址。
找了好多办法,尝试了好多方式,都不行,只要人家封装包里没有对这个单独的obj定义段,如果多个obj使用的是通用的段名定义,那就没招。
不过后来突然想到,既然LD文件可以对每个封装文件(大多数是我们常数的库文件)指定段基地址,而gcc本身是支持从库里提取obj也就是说,也就是说,可以把期待的obj文件给拆出来做成一个单独的封装库,然后对这个在LD文件里进行处理,就可以实现目的了。 所以,绕了个弯子给解决了。
我也是没办法,国内某厂商提供的库文件,存在一个稳定性问题的bug,后来分析发现,是某子模块内部的一个内部静态变量没有初始化造成的(讲一声粗话kao),又没有提供对外的接口,只好采取这种暴力的方法了。
【 在 tom6bj 的大作中提到: 】
: 哦, 是要具体某个obj里的bss...
: 把你这个源文件的全局变量全部包到一个struct里不就完了, 我一直这么干
:
--
FROM 98.126.12.*
这厂商是乐鑫?
【 在 feiy (null) 的大作中提到: 】
: 能这么干,早就这么干了。我的目的是,给你一个现成的(外来)封装包(库),也就是说,你没法改人家的封装包库了。这个封装包里由多个obj模块组成,想获取其中某个obj所分配的bss段的起始地址。
: 找了好多办法,尝试了好多方式,都不行,只要人家封装包里没有对这个单独的obj定义段,如果多个obj使用的是通用的段名定义,那就没招。
: 不过后来突然想到,既然LD文件可以对每个封装文件(大多数是我们常数的库文件)指定段基地址,而gcc本身是支持从库里提取obj也就是说,也就是说,可以把期待的obj文件给拆出来做成一个单独的封装库,然后对这个在LD文件里进行处理,就可以实现目的了。 所以,绕了个弯子
: ...................
--
FROM 36.45.174.*