Вот тест, воспроизводящий проблему:
$ echo "void whatever() {}" > prog.c
$ gcc prog.c
Это приводит к следующей ошибке в GCC 4.8.4:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
... etc ...
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 21
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Обратите внимание, что в GCC 6.2.0 ошибки, связанные с этим вопросом, исчезают, и вместо этого он производит только:
/usr/lib/x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
Об этом сообщается несколько раз рядом пользователей, в переполнении стека и в других местах.
Я хотел бы понять эту ошибку, а не решить ее (она уже решена).
Эта ошибка возникает при выполнении gcc-4.8 prog.c
без функции main()
внутри prog.c
.
Я выполнил текстовый поиск этой ошибки в пакете binutils-source. Утомленный googling дал мне только одну полезную ссылку, помогающую мне лучше понять концепцию обработки переводов.
Количество ошибок, по-видимому, не зависит от программы, что предполагает, что рассматриваемые перемещения не возникают в этом файле, а как прямой результат отсутствия функции main()
. Я предположил, что 3 из этих перемещений с неправильными индексами могут быть для main()
, argc
и argv
, но многие остаются, и это всего лишь недоказанная гипотеза.
Это совершенно выше моей головы, и любая информация, которая поможет мне лучше понять ее или что изменилось в более поздних версиях GCC, будет тепло приветствоваться.