Где я могу найти объектный файл, содержащий определение функции printf?

Я использую компилятор gcc и ОС Ubuntu 12.04. Я хочу знать, где я могу найти объектный файл и в каком каталоге он содержит определение функции printf. Опять же, я ищу не заголовочный файл, содержащий прототип, а объектный файл, содержащий фактическое определение.


person Ananda    schedule 25.07.2012    source источник
comment
Это часть libc. Что именно вы ищете? Например, вы ищете определение в исходном коде или в библиотеке, которая его содержит на вашем компьютере?   -  person another.anon.coward    schedule 25.07.2012
comment
Я ищу объектный файл в libc, который содержит определение кода printf.   -  person Ananda    schedule 26.07.2012


Ответы (2)


Вы ищете объектный файл или исходный файл?

Объектный файл .o хранится в библиотеке libc.so. В большинстве дистрибутивов Linux этот файл находится по адресу /lib/libc.so. В Ubuntu 11 и 12 в рамках поддержки нескольких архитектур содержимое /lib было перемещено до /lib/i386-linux-gnu и /lib/x86_64-linux-gnu.

Вы можете получить отдельный объектный файл с помощью команды ar (архив), которая использовалась для создания библиотеки с параметром x (извлечение):

ar x libc.a stdio.o 

Однако это не кажется очень полезным, поэтому я предполагаю, что вам действительно нужен исходный файл, а не объектный файл. Для этого вы должны установить пакет glibc, который содержит printf.c (который вызывает vprintf, который вызывает vfprintf, который содержит фактический код для printf).

Этот источник можно просматривать на Launchpad. . Это довольно сложно и занимает более 2000 строк кода.

person Kevin Vermeer    schedule 25.07.2012
comment
У меня есть 3 конкретных вопроса в связи с этим: (1) Используя команду ar, перечислите все объектные файлы, которые присутствуют в libC 2. Среди этих объектных файлов какой файл содержит определение printf ()? Какую команду вы использовали, чтобы узнать это? 3. Можно ли уменьшить размер конечного исполняемого файла, включив в него только те определения, которые реально и нужны/используются в программе? Если да, то как. - person Ananda; 26.07.2012
comment
Вздох. Это домашнее задание? (1) man ar, (2) objdump + some options | grep printf (3) См. документацию GCC и попробуйте. - person Kevin Vermeer; 26.07.2012

Я нашел точный ответ на первые два моих вопроса -

  1. Чтобы вывести список всех объектных файлов, присутствующих в libc, мы используем следующие команды:

    Система x86_64: $ ar -t /usr/lib/x86_64-linux-gnu/libc.a

    Система i386: $ ar -t /usr/lib/i386-linux-gnu/libc.a

  2. Чтобы узнать, какой объектный файл содержит функцию printf, запустите эту команду в /usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu или в каталоге:

    $ nm -o libc.a | grep -w printf

  3. Продолжаем искать правильный ответ.

person Ananda    schedule 26.07.2012
comment
Да, nm — хорошая альтернатива objdump, когда вы имеете дело с библиотеками. - person Kevin Vermeer; 26.07.2012