GCC符号表优化-名称合并

时间:2019-05-27 13:07:29

标签: c++ c gcc

我注意到较新版本的GCC在符号表中做了一些奇怪的优化。仅当存在名称(函数或变量)后缀为其他名称时,才发生这种情况,然后编译器仅放置较长的名称。

例如,如果同一对象中有两个函数,名称分别为LONGER_FUNCTIONFUNCTION,则编译器将仅在符号表中放置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来查看两个输出。

0 个答案:

没有答案