Мне пришлось решить эту проблему при интеграции двух сторонних библиотек от одного поставщика. Обе библиотеки использовали одни и те же имена символов, но они не были совместимы друг с другом. Поскольку они исходили от продавца, мы не могли позволить себе искать и заменять. И переменные задачи также не были применимы, так как (а) две библиотеки могли быть вызваны из одной и той же задачи и (б) некоторые символы дублирования были функциями.
Предположим, у нас есть app1 и app2, связанные соответственно с lib1 и lib2. Обе библиотеки определяют одинаковые символы, поэтому должны быть скрыты друг от друга.
К счастью (если вы используете инструменты GNU), objcopy позволяет вам изменять тип переменной после связывания.
Вот эскиз решения, вам придется изменить его для своих нужд.
Сначала выполните частичную ссылку для app1, чтобы связать ее с lib1. Здесь я предполагаю, что вы уже частично связали * .o в app1 с app1_tmp1.o.
$(LD_PARTIAL) $(LDFLAGS) -Wl,-i -o app1_tmp2.o app1_tmp1.o $(APP1_LIBS)
Затем спрячьте все символы из lib1 в объекте tmp2, который вы только что создали, чтобы сгенерировать «настоящий» объект для app1.
objcopymips `nmmips $(APP1_LIBS) | grep ' [DRT] ' | sed -e's/^[0-9A-Fa-f]* [DRT] /-L /'` app1_tmp2.o app1.o
Повторите это для app2. Теперь у вас есть app1.o и app2.o, готовые без каких-либо конфликтов связать ваше окончательное приложение.
Недостаток этого решения заключается в том, что у вас нет доступа ни к одному из этих символов из оболочки хоста. Чтобы обойти это, вы можете временно отключить скрытие символа для одной или другой библиотеки для отладки.