我注意到较新版本的GCC在符号表中做了一些奇怪的优化。仅当存在名称(函数或变量)后缀为其他名称时,才发生这种情况,然后编译器仅放置较长的名称。
例如,如果同一对象中有两个函数,名称分别为LONGER_FUNCTION
和FUNCTION
,则编译器将仅在符号表中放置LONGER_FUNCTION
名称。可以肯定的是,如果在对象上运行“ nm”,则会得到两个符号(我猜较短的符号是指较长的带有偏移量的符号),但是,如果在对象文件上运行“字符串”,则只会得到较长的符号名称LONGER_FUNCTION
。
较早的GCC版本(我检查过版本4)不是这种情况,所有符号都单独列出,无论其结尾的一部分代表另一个符号名称。
所以,这不是一个真正的错误,但是对我来说这只是一个问题,因为我对目标文件进行了一些后期处理(不要使用“ nm”),并且必须列出所有符号。如果有人知道如何在GCC中禁用此功能,我将不胜感激。
示例代码:
#include <stdlib.h>
int LONGER_VARIABLE;
int VARIABLE;
void LONGER_FUNCTION (unsigned char * buf)
{
if (LONGER_VARIABLE)
VARIABLE = 0;
}
void FUNCTION (unsigned char * buf)
{
if (VARIABLE)
LONGER_VARIABLE = 1;
}
gcc -c“ c文件” -o“ obj文件”
最后,只需在目标文件上运行“ nm”和“ strings”以查看区别。最好使用gcc 4和gcc 7来查看两个输出。