如何检查.so中定义的宏?我会使用nm来检查功能,是否可以对宏执行相同的操作?

tkr*_*top 4 c linux nm .so

我在mylib.h中有这样的代码,然后使用它来创建mylib.so。有没有办法检查.so中如何定义MY_MACROS?

#ifdef SWITCH_CONDITION
    #define MY_MACROS       0
#else
    #define MY_MACROS       1
#endif
Run Code Online (Sandbox Code Playgroud)

如果那是一个函数,我会简单地做

nm mylib.so | grep myfunction
Run Code Online (Sandbox Code Playgroud)

有没有办法对宏做同样的事情?

PS应该是因为

> grep MY_MACROS mylib.so 
> Binary file mylib.so matches
Run Code Online (Sandbox Code Playgroud)

Ste*_*mit 5

通常,无法对宏执行此类操作。(但请参阅下文。)

理论上,预处理器宏是一个编译时概念。事实上,在C的早期实现中,预处理器是-字面-一个独立的程序,在一个单独的进程中运行,转换的C代码与#include#define#ifdef成没有它们的C代码。实际的C编译器仅看到“预处理”代码。

现在,从理论上讲,编译器可以以某种方式保存一些宏定义的记录,也许有助于调试。我不知道有谁这样做,尽管显然使用DWARF格式的人确实可以做到!请参阅下面的评论和@ JL2210的答案

您始终可以编写自己的显式代码来跟踪某些宏的定义。例如,我经常写代码来延长

void print_version()
{
    printf("myprogram version %s", VERSION_STRING);
#ifdef DEBUG
    printf(" (debug version)");
#endif
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

一些项目具有相当复杂的机制来跟踪对特定构建有效的编译开关。例如,在由configure脚本管理的项目中,通常config.status为后代提供一个文件,其中包含所有编译选项的一条记录。

  • @ JL2210我很想做同样的事情!您可能已经知道这一点,但是在重新设计轮子之前,请检查https://en.wikipedia.org/wiki/DWARF上的外部链接。 (2认同)