2010-04-16 5 views
1

В Solaris 10 я создаю библиотеку A.so, которая вызывает функцию f(), которая определена в библиотеке B.so. Чтобы скомпилировать библиотеку A.so, я объявляю в своем коде f() как extern.Как обнаружить неразрешенный символ при создании библиотеки?

К сожалению, я «забыл» объявить в make-файле A, что он должен связываться с B. Однако «make A» не вызывает никаких предупреждений, ошибок и библиотеки A.so.

Конечно, при выполнении кода A вызывается вызов f(), поскольку он не определен.

Есть ли способ (вариант компоновщика, трюк кода ...), чтобы сделать компиляцию библиотеки A неудачной? Как я могу убедиться, что все символы, упомянутые в библиотеке A, определены во время компиляции?

Спасибо за любые предложения.

ответ

1

Простейший способ: добавить в файл make «test_lib», который будет генерировать двоичный код, используя все символы, выведенные из библиотекиA. (не должно быть ничего значимого ... просто возьмите адрес, не нужно вызывать функцию или что-то еще, на нее просто нужно ссылаться).

1

Танки

Я думаю, что я нашел что-то интересное и еще проще в ручном компоновщике (d'хо)

Опции -z Defs и --no-неопределенного вариант силу фатальной ошибка если какие-либо неопределенные символы остаются в конце ссылки. Этот режим является значением по умолчанию при создании исполняемого файла. По историческим причинам этот режим не является стандартным при создании общего объекта. Рекомендуется использовать опцию -z defs, так как этот режим гарантирует, что построенный объект является автономным. Автономный объект имеет все символические ссылки, разрешенные внутри, или к непосредственным зависимостям объекта.

+0

1-й ответ в http://stackoverflow.com/questions/1617286/easy-check-for-unresolved-symbols-in-shared-libraries на самом деле то, что я искал. – Simon