2017-01-31 23 views
1

Предположим, я хочу вызвать функцию C: printf, getpid, socketpair или любую другую стандартную функцию C из моего кода на языке ассемблера. Я знаю, как это сделать с точки зрения реализации. Тем не менее, я также должен знать, где определена одна из этих функций - в каком файле Linux, чтобы я мог передать имя этого файла в компоновщик. Я думаю, что это должен быть «такой» файл. Как узнать, в каком файле он определен?В каком файле определена функция C?

Примечание, что мой вопрос является общим и функции, которые я упомянул выше, являются лишь примером. Как я узнаю, в какой библиотеке Linux определена любая произвольная функция C?

+2

Возможный дубликат [Как узнать, какие флаги компоновщика необходимы для использования данной функции библиотеки C?] (Http://unix.stackexchange.com/questions/277845/how-can-i-findoutout -what-linker-flags-required-to-use-a-given-c-library-functio) – JigglyNaga

ответ

1

Если это стандартная функция библиотеки C, libc.so, вероятно, верна.

Если это еще одна библиотека, , то в документации библиотеки вам следует сообщить. Например. страница руководства для pthread_create говорит

компилировать и компоновать с -pthread

и затем вы должны смотреть на документацию GCC, чтобы увидеть, что он делает с этой опцией (например, -lpthread плюс некоторые другие вещи, так вы хотите libpthread.so).

С сторонними библиотеками бремя ответственности полностью принадлежит разработчику/дистрибьютору библиотеки, чтобы сообщить вам, где найти символы, перечисленные в их API.

В худшем случае вы можете просто find все .so файлы в /usr, /lib, /opt или везде, где у вас есть библиотеки установлены, и запустить nm -D на них. Вы ищете записи типа t или T.

Обратите внимание, что мы предполагаем, что вам нужны только общие объекты (динамические библиотеки) - если вы говорите о произвольных сторонних библиотеках, они могут одинаково отправлять статические (.a) архивы.

+1

Обратите внимание, что так же сложно узнать, какую библиотеку можно связать с программой на C. Если функция не находится в стандартной библиотеке C, которая связана по умолчанию, вам просто нужно будет узнать из документации, какую библиотеку нужно связать. Также обратите внимание, что вы можете использовать программу 'gcc' для компиляции программ сборки. Допустим, ваш код сборки находится в файле 'hello.s', и вы вызываете функцию' printf'. Скомпилируйте с помощью 'gcc -o hello hello.s' для создания исполняемого файла' hello'. Программа «gcc» выполняет для вас ссылку, как и в случае с программой C. –

2

Эти (printf, getpid, socketpair) являются частью стандартной библиотеки C. Это библиотека, которая автоматически привязывается к каждой программе на C.

Я думаю, что самый простой способ решить проблему будет связать его с НКУ, который будет вызывать компоновщик и связать соответствующую версию стандартной библиотеки C в

Если вы хотите, чтобы продолжить свой путь.:

echo 'int main(){ }' |gcc -x c - && ldd ./a.out |grep libc 

должен предоставить вам файл so. В моем случае это:

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc3a2b46000) 

Там нет универсального решения для функции x, насколько я знаю. Вам нужно, чтобы Google отображал функцию в библиотеке. Если библиотека использует префикс библиотеки, а не голые имена (например, стандартная библиотека C, к сожалению, в большинстве случаев), поиск в Интернете должен быть довольно однозначным. (После этого вам нужно найти, где находится SO-файл библиотеки в вашей системе.)

+0

Это не то, о чем я прошу. – Torito

+0

libc.so - общий объект, содержащий стандартную библиотеку C. Таким образом, ответ на «стандартную библиотеку C» - с указанием пути .so также показан - кажется довольно разумным – Useless

+0

'Нет общего решения для функции x, насколько я знаю.' - а не в руководствах? – Torito