LINUX.ORG.RU

Как включить в код на Си сигнатуру, которую не уберёт оптимизатор?

 


0

1

Собственно, нужно, чтобы после компиляции кода на Си - через strings exe_file, либо просто fgrep 'строка' exe_file было видно строку, включенную туда просто как «сигнатура» - признак того, что это именно тот файл, который я компилировал.

При этом строка текста не используется никак. Я проверял: неиспользуемые строки, потенциально засоряющие сегмент данных компилятор с обычным уровнем -O2 конечно же удаляет. Как бы это так сделать, чтобы всё же некий «неудаляемый» признак можно было оставить в исходниках, при этом не изменяя ничего в рабочем коде или изменяя абсолютно минимально?

Прошу не бить за глупый вопрос: я не программист на Си, это нужно для чужого кода.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)
__attribute__((visibility("default"))) const char* signature = "my cool signature\n";

int main(int argc, char** argv)
{
        return 0;
}
$ gcc -O2 t.c -o t && strings t | grep cool
my cool signature
sjinks ★★★
()

Это как-то грязно, лучше --build-id линкеру передавать.

anonymous
()
Ответ на: комментарий от sjinks
__attribute__((visibility("default"))) const char* signature = "my cool signature\n";

То, что доктор прописал, спасибо!

DRVTiny ★★★★★
() автор топика

Старое доброе

#ifndef lint
const char rcsid[] = "$Id$";
#endif /* not lint */
уже не годится?

beastie ★★★★★
()

GCC 6.1, также не смог «соптимизировать». А простое и переносимое volatile перед переменной не даст нужного эффекта?

JaneDoe
()

встречный вопрос - а причём тут компиляция ? Вбейте это строку в elf на уровне линкера.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Вбейте это строку в elf на уровне линкера.

+1

Можно добавить собственную секцию и затолкать туда какие угодно данные. Плюс в том, что результат можно будет нормально обрабатывать программно, а не через «а давайте ка поищем всё, что похоже на строки».

Deleted
()

число философски volatile char sign[]=«my sign»; должно отбивать руки всем оптимизаторам дотрагивающимся до sign. Хотя про строки не зарекусь - в volatile ничего крупнее int не загонял

MKuznetsov ★★★★★
()

уася с пятью звёздами, объяви свою строку вне функции и всё будет ок.

anonymous
()

А чем плох старый добрый ident ?

#ident "Super file revision 0.1.2.3"

main() {}

Проверяем:

$ gcc -O6 -o ident ident.c
$ strings -a ident | fgrep -i super
Super file revision 0.1.2.3
io ★★
()
Ответ на: комментарий от io

Решение с ident тоже красивое, согласен!

Как руки дойдут, поменяю ту const char, которая с атрибутом, на ident.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Только надо помнить, что ident можно таки удалить:

$ strip -R .comment ident
$ strings -a ident | fgrep Super
$

Впрочем, если знать маркер, то от него всегда можно избавиться, например, просто vi.

io ★★
()
Последнее исправление: io (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.