Оптимизация таблицы символов GCC - объединение имен - PullRequest
5 голосов
/ 27 мая 2019

Я заметил, что более новые версии 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, чтобы увидеть оба вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...