Компиляция всех символов объектного файла как слабых - PullRequest
2 голосов
/ 26 октября 2011

Мотивация

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 26 октября 2011

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

Другая возможность может заключаться в том, чтобы попросить g++ пролить код сборки (с помощью * 1005).*) и иметь некоторые (возможно, awk или ed) скрипты, работающие над ним.

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

1 голос
/ 20 июня 2017

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

0 голосов
/ 26 октября 2011

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

...