【发布时间】:2017-11-28 19:49:00
【问题描述】:
我正在尝试在 C 中查找结构的变量名称。示例:
def.h
typedef struct
{
int fov_one;
int fov_two;
int timing_chain;
...
...
float ratio;
float spare_floats[15];
}PARAMETERS;
该结构最多可容纳 200 个参数,但目前只有部分参数在使用。目前,结构 PARAMETERS 中的值由二进制文件填充。但是,一些用户希望在填充后在运行时更改其中的一两个值。我想创建基于变量名的字符串版本更改值的选项。例如,如果我想更改变量比率,我希望用户能够输入字符串“ratio .25”并将“ratio”的当前值替换为“.25”。
根据我的阅读,由于没有反射,因此无法根据 C 中变量名称的字符串版本找到变量。目前,我的想法是解析标头以获取变量名称,但有人提到可能在将名称剥离之前从链接器获取名称。据我了解,编译器/链接器在编译期间删除了变量名,并使用地址来访问变量,而不是符号。
我想知道是否可以打印出包含编译器/链接器创建的变量名称和偏移量的符号映射。
使用 gcc 选项
gcc -o foo foo.c -Wl,Map,foo.map
创建一个映射,但不包含结构的变量名。
是否可以提取编译器/链接器在编译时创建的变量偏移映射?
【问题讨论】:
-
字段的名称在编译时是已知的,因此您需要创建一个函数来了解这 200 个字段中的每一个以及用于更新它们并将它们映射在一起的关键字。