у меня есть общий файл obj, скажем, a.so, и в нем я хочу увидеть, встроена ли конкретная функция (скажем, fname) или нет. Я попробовал следующие 4 способа и получить разные ответы:
1) nm a.so | grep fname
-> это не дает никаких о / п, подразумевая, что функция встроена.
Пожалуйста, дайте мне знать, достаточно ли это проверить, чтобы увидеть, встроена ли функция или нет.
2) objdump -d a.so | grep fname
-> это не дает никаких о / п, подразумевая, что функция встроена. Пожалуйста, поправьте меня, если я ошибаюсь в заключении здесь.
3) objdump -W a.so
-> для функции fname это дает мне следующую o / p, последняя строка которой гласит «объявлено как встроенное, но проигнорировано»
DW_AT_name : (indirect string, offset: 0x10411): fname
DW_AT_decl_file : 246
DW_AT_decl_line : 40
DW_AT_prototyped : 1
DW_AT_inline : 2 (declared as inline but ignored)
4) pfunct -G a.so | grep fname
-> эта утилита dwarves показывает функцию fname, подразумевая, что функция не является встроенной.
Теперь первые два способа подразумевают, что функция встроена, а остальные два говорят об обратном. Может кто-нибудь объяснить, пожалуйста, следующее:
1) Why are there differences in the above 4 ways ?
2) Are there any known issues with objdump and pfunct ?
3) Also let me know the best way to check if a function is inlined or not.
Любая помощь будет оценена. Спасибо !!!
Поскольку функция вызывается только в одном месте файла .c, лучший способ проверить, является ли функция встроенной, заключается в следующем:
objdump -d a.so | grep call | grep fname
Если есть какой-либо результат, то fname
не указывается В противном случае он должен быть встроен, поскольку он вызывается только в одном месте, а сайт вызова не найден.