Я заметил, что более новые версии GCC делают некоторые странные оптимизации в таблице символов. Это происходит только в том случае, если существует имя (функция или переменная), которое является суффиксом другого имени, тогда компилятор устанавливает только более длинное имя.
Например, если в одном объекте есть две функции с именами LONGER_FUNCTION
и FUNCTION
, то компилятор поместит только имя LONGER_FUNCTION
в таблицу символов. Конечно, если вы запустите «nm» на объекте, вы получите оба символа (я думаю, что более короткий относится к более длинному со смещением), но если вы запустите «strings» в объектном файле, то вы получите только более длинный имя 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 file" -o "obj file"
В конце просто запустите «nm» и «strings» в объектном файле, чтобы увидеть разницу. Предпочтительно использовать gcc 4 и gcc 7, чтобы увидеть оба вывода.