gcc / ld: undefined ссылка на неиспользуемую функцию

Я использую gcc 4.3.4 и ld 2.20.51 в Cygwin под Windows 7. Вот упрощенная версия моей проблемы:

  • foo.o содержит функцию foo_bar () , который вызывает bar () в bar.o
  • bar.o содержит функцию bar ()
  • main.c вызывает функции в foo.o , но foo_bar () отсутствует в цепочке вызовов

Если я попытаюсь скомпилировать main.c и связать его с foo.o, я получу ссылку undefined to _foo_bar ошибка от ld. Как вы можете видеть из моего Makefile, за исключением приведенного ниже, я пробовал использовать флаги для помещения каждой функции в отдельный раздел и чтобы компоновщик удалял неиспользуемые разделы.

COMPILE_CYGWIN = gcc -iquote$(INCDIR)
COMPILE = $(COMPILE_CYGWIN) -g -MMD -MP -Wall -ffunction-sections -Wl,-gc-sections $(DEFINE)
main_OBJECTS = main.o foo.o
main.exe : $(main_OBJECTS)
    $(COMPILE) -o main.exe $(main_OBJECTS)

Функция foo_bar () - это короткая функция который обеспечивает соединение между двумя сетевыми уровнями в стеке протоколов. Некоторым программам это не нужно, поэтому они не будут ссылаться на другие объектные файлы, относящиеся к верхнему уровню стека. Это небольшая функция, и кажется неуместным помещать ее в отдельный файл .o.

Я не понимаю, почему ld выдает ошибку - ничего не вызывает foo_bar () , так что в этом нет необходимости включить bar () в окончательный исполняемый файл. Сотрудник только что сказал мне, что ld не является «умным компоновщиком», так что, может быть, то, что я пытаюсь сделать, невозможно?

5
задан tomlogic 11 April 2011 в 17:46
поделиться