Как обнаружить неразрешенный символ при создании библиотеки? - PullRequest
1 голос
/ 16 апреля 2010

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

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

Конечно, при выполнении кода А вызов функции f () завершается сбоем, поскольку он не определен.

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

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

Ответы [ 2 ]

1 голос
/ 16 апреля 2010

Танки

Мне кажется, я нашел что-то интересное и даже более простое в руководстве для линкера (d'ho)

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

1 голос
/ 16 апреля 2010

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

...