创建编译时变量偏移图

时间:2017-11-28 19:49:00

标签: c gcc gdb

我试图在C中找到结构的变量名。例如:

def.h

typedef struct
{
    int fov_one;
    int fov_two;
    int timing_chain;
    ...
    ...
    float ratio;
    float spare_floats[15];
}PARAMETERS;

该结构最多可容纳200个参数,但目前只有部分参数正在使用中。目前,结构PARAMETERS中的值由二进制文件填充。但是,某些用户希望在填充后在运行时更改一个或两个值。我想创建一个基于变量名的字符串版本更改值的选项。比如,如果我想改变变量比,我希望用户能够输入一个字符串"比率.25"并替换" ratio"的当前值用" .25"。

根据我的阅读,由于没有反射,因此无法在C中根据变量名的字符串版本找到变量。目前,我的想法是解析头部以获取变量名称,但是有人提到它可能在链接之前从链接器获取名称。根据我的理解,编译器/链接器在编译期间删除变量名称并使用地址来访问变量,而不是符号。

我想知道是否可以打印出包含编译器/链接器创建的变量名和偏移量的符号映射。

使用gcc选项

gcc -o foo foo.c -Wl,Map,foo.map

创建一个地图,但不包含结构的变量名称。

是否可以在编译时提取由编译器/链接器创建的变量偏移映射?

1 个答案:

答案 0 :(得分:0)

由于您控制源代码,常用的技术是生成"名称以抵消"在编译时映射。

例如:

// parameter_fields.inc -- describes fields in struct PARAMETERS
xxx(int, fov_one)
xxx(int, fov_two)
...
xxx(float, ratio)

// def.h
struct _PARAMETERS {
 #define xxx(a, b) a b;
  #include "parameter_fields.inc"
 #undef xxx
} PARAMETERS;

// in somefile.c
#include <stddef.h>
#include "def.h"

struct {
  const char *name;
  int offset;
} PARAMETER_OFFSETS[] = {
 #define xxx(a, b)  #b, __offsetof__(struct _PARAMETERS, b),
  #include "parameter_fields.inc"
 #undef xxx
};

现在,您可以将代码作为PARAMETER_OFFSETS数组的一部分随时用于代码。