如何在 GCC 插件的目标文件中嵌入元数据
How to embed metadata in object file from GCC plugin
我正在尝试编写一个 GCC 插件,对它编译的程序进行一些特定领域的分析。我想知道将分析结果作为某种元数据(如调试信息)嵌入到生成的目标文件中的最佳方法。
理想情况下,一些元数据(在我的例子中是文本)应该嵌入到每个目标文件中,链接器应该保留它链接的所有对象的数据,最后我应该有一些方法来访问所有的元数据使用 objdump
、readelf
或类似的最终二进制文件。
我目前的想法是通过将其添加到 GIMPLE AST 来尝试为每个编译单元添加一个唯一命名的全局字符串变量。但是,我想知道是否有更多 "disciplined" 方式;插件如何生成调试信息或其他此类元数据?
我给自己一个初步的答案,基于这个关于如何创建全局变量的答案:Insert global variable declaration whit a gcc plugin
此代码似乎仅适用于将长度为 size
的字符串 my_string
作为二进制变量 varname
嵌入:
// make a char array type
type = build_array_type_nelts(char_type_node, size);
// create the variable and set its name
var = add_new_static_var(type);
name = get_identifier(varname);
DECL_NAME(var) = name;
// make sure this is a definition (otherwise GCC optimizes it away!)
TREE_PUBLIC(var) = 1;
// initialize the variable to a string value
initializer = build_string_literal(size, my_string);
DECL_INITIAL(var) = initializer;
我正在尝试编写一个 GCC 插件,对它编译的程序进行一些特定领域的分析。我想知道将分析结果作为某种元数据(如调试信息)嵌入到生成的目标文件中的最佳方法。
理想情况下,一些元数据(在我的例子中是文本)应该嵌入到每个目标文件中,链接器应该保留它链接的所有对象的数据,最后我应该有一些方法来访问所有的元数据使用 objdump
、readelf
或类似的最终二进制文件。
我目前的想法是通过将其添加到 GIMPLE AST 来尝试为每个编译单元添加一个唯一命名的全局字符串变量。但是,我想知道是否有更多 "disciplined" 方式;插件如何生成调试信息或其他此类元数据?
我给自己一个初步的答案,基于这个关于如何创建全局变量的答案:Insert global variable declaration whit a gcc plugin
此代码似乎仅适用于将长度为 size
的字符串 my_string
作为二进制变量 varname
嵌入:
// make a char array type
type = build_array_type_nelts(char_type_node, size);
// create the variable and set its name
var = add_new_static_var(type);
name = get_identifier(varname);
DECL_NAME(var) = name;
// make sure this is a definition (otherwise GCC optimizes it away!)
TREE_PUBLIC(var) = 1;
// initialize the variable to a string value
initializer = build_string_literal(size, my_string);
DECL_INITIAL(var) = initializer;