Во втором случае - со статической библиотекой - в командной строке написано "собрать exe из main.o и добавить все необходимые вещи из src.a".ld
просто игнорирует библиотеку, потому что для main.o
не требуется никаких внешних символов (на outerUnusedFunc
нет ссылки из main.o
).
Но в первом случае командная строка говорит "build exe из main.o и src.o".ld
должен поместить src.o
содержимое в выходной файл.Следовательно, он обязывает анализировать модуль src.o
, добавлять outerUnusedFunc
в выходной файл и разрешать все символы для outerUnusedFunc
, несмотря на то, что он не используется.
Вы можете включить сборку мусора для секций кода
gcc --function-sections -Wl,--gc-sections -o exe main.c src.c
В этом случае outerUnusedFunc
(как и все другие функции) будет размещен в отдельном разделе.ld
увидит, что этот раздел не используется (символы не указаны).Он удалит весь раздел из выходного файла, так что innerUndefinedFunc
не будет ссылаться и символ не будет разрешен - тот же результат, что и в случае библиотеки.
С другой стороны, вы можете вручную ссылаться на outerUnusedFunc
как "undefined", так что ld
должен найти его в библиотеке и добавить в выходной файл.
ld -o exe main.o -u outerUnusedFunc src.a
в этом случае будет выдана та же ошибка (неопределенная ссылка на innerUndefinedFunc).