如何检查.so 中定义的宏?我会使用 nm 来检查功能,有没有办法对宏做同样的事情?

How to check macros defined in .so? I'd use nm to check the function, is there a way to do the same for macros?

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

#ifdef SWITCH_CONDITION
    #define MY_MACROS       0
#else
    #define MY_MACROS       1
#endif

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

nm mylib.so | grep myfunction

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

P.S。应该是因为

> grep MY_MACROS mylib.so 
> Binary file mylib.so matches

一般来说,没有办法为宏做这种事情。 (但请参阅下文。)

预处理器宏在理论上是一个编译时概念。事实上,在 C 的早期实现中,预处理器是——从字面上看——一个单独的程序,运行 在一个单独的进程中,将 C 代码转换为 #include#define#ifdef 在没有它们的情况下转换为 C 代码。实际的 C 编译器只看到 "preprocessed" 代码。

现在,理论上编译器可以以某种方式保存一些宏定义的记录,也许是为了帮助调试。我不知道有任何人这样做,尽管显然那些使用 DWARF format actually do! See comments below, and .

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

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

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

是的,但它需要调试信息。

您可以使用 -g3:

编译您的代码
$ gcc -g3 -shared -fPIC test.c -o test.so

然后 运行 strings 在生成的二进制文件上:

$ strings test.so
...
__DEC32_EPSILON__ 1E-6DF
MY_MACROS 1
__UINT_LEAST32_TYPE__ unsigned int