Компиляция всех символов объектного файла как слабых

#c #c #gcc #compiler-construction #linker

#c #c #ссагпз #компилятор-конструкция #компоновщик

Вопрос:

Мотивация

У меня есть 2 статические библиотеки, libStatic1.a и libStatic2.a. Кроме того, у меня есть много SOs (общих объектов), которые компилируются с libStatic1.a. До сих пор libStatic1.a и libStatic2.a были независимыми, и все было в порядке. Но теперь я добавил в код, который генерирует libStatic1.a зависимость от кода, который генерирует libStatic2.a. Поэтому любой SO, который зависит от libStatic1.a, теперь должен быть скомпилирован с помощью libStatic2.a. Это нежелательно, поскольку добавляет зависимость от libStatic2.a к каждой цели сборки это зависит от libStatic1.a.

только на libStatic1.a теперь нужно скомпилировать их код с помощью libStatic2.a, чтобы компиляция / время выполнения завершились успешно / не завершились сбоем. Это создает ненужную связь, и я хотел бы избежать этого.

Поэтому мне нужно как-то «встроить» объектный код libStatic2.a в libStatic1.a. Если бы я просто скомпилировал libStatic1.a со всеми объектными файлами libStatic2.a (в дополнение к его собственным), он в основном будет содержать его, но это создает другую проблему — если какой-либо пользовательесли libStatic1.a решит использовать libStatic2.a и свяжет его, он получит странную ошибку «несколько определений». Если бы я мог каким-то образом сказать компилятору сгенерировать объектные файлы libStatic2.a со слабыми символами (только для использования в libStatic1.a), это решило бы проблему — никто не получит несколько определений, и ни один makefile из всех многих SO, которые используют libStatic1.a, не нужно будет менять.

Мое мышление: Я знаю, что возможно (используя расширения GCC / g для языка C) объявить функцию с ключевым словом __attribute__ и слабым атрибутом следующим образом: void __attribute__((weak)) foo(int j);

Есть ли способ сообщить компилятору (g ) скомпилировать весь модуль компиляции как «слабый», что означает, что все его глобальные символы в таблице символов будут считаться слабыми при компоновке?

В качестве альтернативы, есть ли способ сообщить компоновщику (ld), чтобы он рассматривал все символы некоторого объектного файла / библиотеки, как если бы они были слабыми?

Комментарии:

1. Возникают ли конфликты символов при компоновке?

2. @trojanfoe и Максим Егорушкин: теперь я закончил редактировать свое первоначальное сообщение, чтобы объяснить свою мотивацию.

Ответ №1:

Если ваша библиотека невелика, простейшим способом по-прежнему является изменение объявлений путем добавления вручную __attribute__((weak)) .

Другой возможностью может быть запрос g на удаление ассемблерного кода (с -S ) и выполнение над ним некоторого (возможно awk , или ed ) скрипта.

Вы также можете закодировать плагин GCC (при условии, что ваш g имеет версию 4.6) или расширение GCC MELT для этого.

Ответ №2:

Скомпилируйте его в обычном режиме, а затем objcopy с помощью объектного файла --weaken .

Ответ №3:

Нет, похоже, что нет; существует ли так много слабых внешних функций, что нецелесообразно устанавливать их атрибуты по отдельности?