【发布时间】:2018-10-09 22:07:12
【问题描述】:
我想用某种汇编标签/符号来标记特定的 C 行,它不会占用二进制文件中的任何空间,但是通过检查链接器输出映射文件,我将知道所有此类生成标签的出现,并最终知道 C以这种方式“标记”的代码。所以我希望能够定义这样的标签,并使它们成为全局的,并且 used 所以链接器不会把它扔掉 我还需要一些宏魔法来让这些标签在每次预处理 C 代码时都有一个唯一的名称(以确保函数的每个内联实例都有自己的标签 - 否则我猜我会有重复的符号)
例子:
// my build system will pass -DMYFILE_ID for each file, here I am trying to create a unique literal for each inline instance of the function
#define UN(X) #X
#define UNIQUE(X,Y) UN(X##Y)
void my_func(void)
{
_asm("GLOBAL_LABEL_"UNIQUE(MYFILE_ID,__LINE__)":\n\t")
my_c_code_I_want_to_track();
}
最后我想要的是在链接器输出符号映射文件中,类似的东西
0xsome_address GLOBAL_LABEL_12_1
0xdifferent_address GLOBAL_LABEL_12_2
0xyeanotheraddress GLOBAL_LABEL_13_1
这基本上应该让我知道 my_c_code_i_want_to_track 实例化的地址
整个想法的灵感来自于组装中的标签实际上是如何放置的“符号”,因此可以检查它们的地址,但它们实际上并不占用自己的空间。
问题: 1.是否可以像这样定义装配标签 2. 如何让这些标签留在输出符号映射文件中并出现 3. UNIQUE 宏有问题,因为我在尝试编译时得到“标签重新定义”
【问题讨论】:
-
你的问题到底是什么?
-
用问题定义编辑的问题
-
不确定内联是如何工作的,它可以很好地重用相同的
__LINE__。至于你的地图文件:你是如何创建的? -
除非您明确要求,否则不应丢弃、引用或不引用全局变量。
-
在剥离二进制文件之前提取地址信息可能会更简单。