如何检查.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
我在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