Я пытаюсь понять, как делает всемирную программу приветствия работы:Как понять перекрестную ссылку glibc?
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello World!");
return 0;
}
Большинство из них является прямым, за исключением printf
части. Я не знаю, как это работает. Чтобы понять это, я искал glibc cross reference и нашел this page.
Затем я искал printf
, и он вернул мне много results.
Теперь какая из этих printf
s моя программа использует? Как я могу это определить?
Кроме того, например, при открытии first result в этой странице, функция в printf
функции приводит меня к __printf_chk, где функция в __printf_chk
приводит меня к __nldbl___vfprintf_chk, где функция в __nldbl___vfprintf_chk
приводит меня к __vfprintf_chk, где функция __vfprintf_chk
приводит меня снова __nldbl___vfprintf_chk, что создает бесконечную рекурсию. Что происходит?
Итак, как я должен отслеживать источник данной функции/исходного кода?
«Теперь, который один из этих printfs моя программа использует? Как я могу определить это?» Вы должны выяснить, как построена библиотека. Это зависит в основном от того, как вызывается компилятор, который определен в Make-файлах. Которые, вероятно, так же нечитаемы. Разве это не весело? (Spoiler: glibc не забава.) –
Еще один спойлер: вы в конечном итоге попадете в определение [vfprintf в stdio-common/vfprintf.c] (http://osxr.org/glibc/source/stdio- common/vfprintf.C# 0221), но чтобы увидеть взаимосвязь между ними и функциями, такими как '__printf', вам придется пробираться через большой суп макросов препроцессора и деклараций атрибутов GCC. –
@ Rhymoid Является ли причина для всех этих способов создания/сохранения переносимости? – Utku