LINUX.ORG.RU

Имя модуля с нужной функцией

 ,


0

2

Привет, ЛОР!

Подскажи мне вот что: а есть ли способ узнать во время компиляции, в каком модуле находится нужная мне функция? Допустим, если функция main() находится в модуле main.o, есть ли какой-то макрос FIND_FUNCTION, который при вызове FIND_FUNCTION(main) вернёт строку «main.o»?

Знаю, что это очень странная хотелка, но не вижу причин почему это не может в принципе быть возможным.

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 1)

Если под «модулем» ты понимаешь единицу трансляции - нет конечно, они друг о друге ничего не знают.

Очередная xy проблема? Чего добиться то хочешь?

vvviperrr ★★★★★
()
Последнее исправление: vvviperrr (всего исправлений: 1)
Ответ на: комментарий от vvviperrr

Если под «модулем» ты понимаешь единицу трансляции - нет конечно, они друг о друге ничего не знают.

Да, именно.

Очередная xy проблема? Чего добиться то хочешь?

Примерно так, да. Нужно для дебажной инфы.

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

Можешь после компиляции всех *.o сканировать их (не знаю чем, думаю какая-то стандартная утилита) в поисках функций, составлять из них таблицу в формате массива на си, дописывать туда функцию поиска по этой таблице, компилировать получившийся файл и использовать функцию из него во всех остальных где тебе нужно.

Но это всё если тебе действительно нужно узнавать файл с произвольной функцией, а не только с той, которая в данный момент исполняется. (для этого уже выше макросы предложили)

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

Или лучше так:

Создаёшь файл find_function.h с содержимым

#define FIND_FUNCTION(name) "(unknown)"
инклюдишь его отовсюду где нужно, всё компилируешь, потом собираешь описанным выше способом список функций, но делаешь не массив, а много define:

#define ___FIND_FUNCTION___main "main.o"
#define ___FIND_FUNCTION___func2 "file2.o"

и в конце

#define FIND_FUNCTION(name) ___FIND_FUNCTION___##name

кладёшь это всё в find_function.h вместо первоначальной заглушки, перекомпилируешь всё ещё раз и готово.

firkax ★★★★★
()

Объединение объектных файлов происходит после компиляции. Во время линковки. Компилятору зачем про объектные файлы вообще знать?

thegoldone ★★
()

Функция изнутри себя знает в каком она модуле (макрос FILE).

Главный вопрос - что значит «во время компиляции»?!

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

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

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

Главный вопрос - что значит «во время компиляции»?!

Значит, что в итоговом коде будет уже готовый указатель на строку где-то в .rodata.

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

Я бы это делал какой нить внешней утилитой.

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

Значит, что в итоговом коде будет уже готовый указатель на строку где-то в .rodata.

В Linux что-то такое засунули для debug’а, можешь посмотреть как у них это реализовано.

cumvillain
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.