2016-03-11 3 views
0

У меня вопрос относительно использования одного из вариантов компоновщика GCC: -Wl, - defsym.Ошибка поиска символа при использовании -Wl, - defsym GCC option

Некоторое время назад я решил переписать один из своих проектов на C++, но без использования его стандартной библиотеки и даже без привязки к нему (я компилирую исходные файлы .cpp в объектные файлы с помощью компилятора C++, но связываю их с помощью компилятора C) ,

Для этого я использовал следующие флаги компилятора:

-fno-exceptions -fno-rtti -nostdlib -nodefaultlibs 

И следующие опции компоновщика:

-Wl,--defsym -Wl,__cxa_pure_virtual=0 

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

examples/bin/blink: symbol lookup error: examples/bin/libblink.so: undefined symbol: __cxa_pure_virtual 

где мигнутие имя исполняемого файла и libblink.so это имя моей общей библиотеки.

Я попытался это исправить, и это выглядит как замена --Wl, - defsym компоновщик флаг (как для исполняемого файла и библиотеки) с помощью этой функции:

extern "C" void __cxa_pure_virtual 
{ 
    while (true); 
} 

делает работу. Почему -Wl, - defsym не работает в этом случае? Я также хотел бы упомянуть, что я тестировал это под Windows, и он отлично работает.

+0

* Повторите один из моих проектов на C++, но не используя его стандартную библиотеку и даже не связавшись с ней * почему на земле? Стандартная библиотека - это то, что дает C++, это сила! – SergeyA

+1

Существует множество причин, по которым не хотелось бы, чтобы его программа была связана с C++ std lib. Один из них будет ограниченным пространством для встроенных устройств. – user2180248

+0

Я не понимаю: вы использовали вызовы виртуальных функций? Как это должно работать без поддержки времени выполнения? – user16

ответ

0

Я думаю, что я нашел ответ на свой вопрос.

Изменение адреса символа от 0 до любого другого значения устраняет мою проблему. Так вместо того, чтобы:

--Wl,--defsym --Wl,__cxa_pure_virtual=0 

У меня есть:

--Wl,--defsym --Wl,__cxa_pure_virtual=1 

Таким образом, во время выполнения линкер не ищет символ (который я думаю, это тот случай, когда адрес установлен в 0).

Смежные вопросы