Я хочу пометить определенные строки C с помощью метки / символа ассемблера, которые не будут занимать никакого места в двоичном файле, но, изучив файл выходной карты компоновщика, я узнаю все вхождения таких сгенерированных меток и, в конце концов, Cкод, который был «помечен» таким образом.Поэтому я хочу иметь возможность определять такие метки и делать их глобальными, и использовал , чтобы компоновщик не выбрасывал их, мне также нужно немного магии макросов, чтобы эти метки имели уникальное имя каждый раз, когдаКод на Си предварительно обработан (чтобы убедиться, что каждый встроенный экземпляр функции имеет свою собственную метку - иначе у меня будут дублирующиеся символы, я думаю)
Пример:
// my build system will pass -DMYFILE_ID for each file, here I am trying to create a unique literal for each inline instance of the function
#define UN(X) #X
#define UNIQUE(X,Y) UN(X##Y)
void my_func(void)
{
_asm("GLOBAL_LABEL_"UNIQUE(MYFILE_ID,__LINE__)":\n\t")
my_c_code_I_want_to_track();
}
И что бы яхотел бы иметь в конце, находится в файле карты выходных символов компоновщика, что-то вроде этого
0xsome_address GLOBAL_LABEL_12_1
0xdifferent_address GLOBAL_LABEL_12_2
0xyeanotheraddress GLOBAL_LABEL_13_1
, что в принципе должно дать мне представление о том, по каким адресам был создан экземпляр my_c_code_i_want_to_track
Вся идеяв некотором роде вдохновлен тем, что метки в сборке на самом деле являются «символами», которые имеют размещение, и поэтому их адреса можно проверить, но они фактически не занимают свое собственное пространство.
Проблемы: 1. Возможно ли вообщечтобы метки сборки были определены следующим образом 2. Как заставить эти метки остаться и появиться в файле карты выходных символов 3. Итакчто-то не так с макросом UNIQUE, так как я получаю "переопределение метки" при попытке компиляции