Как я могу заставить gcc добавлять префикс ко всем именам символов

Я знаю, что в прошлом была опция -fprefix-function-name, которая добавляла бы префикс ко всем сгенерированным символам, похоже, она больше не является частью gcc. Есть ли другой способ сделать это?


person danielhauagge    schedule 14.04.2012    source источник
comment
Зачем вам это нужно? Возможно, использование пространства имен решит вашу проблему?   -  person George Skoptsov    schedule 15.04.2012
comment
Я компилирую код, который получил от кого-то другого. Код является многопоточным, и он пытается использовать старую, небезопасную библиотеку C. Решение, найденное человеком, написавшим приложение, состоит в том, чтобы иметь несколько копий библиотеки C, каждая из которых имеет свой префикс к имени символа. Затем каждый поток приложения вызывает другую версию функции. Так, например, если в старой библиотеке есть функция oldlib_func, будут версии v1_oldlib_func, v2_oldlib_func, так что поток номер 1 будет вызывать v1_oldlib_func, а поток номер 2 будет вызывать v2_oldlib_func.   -  person danielhauagge    schedule 15.04.2012
comment
Человек, написавший приложение, должен был создать эти разные версии старой библиотеки с этими префиксами, дело в том, что я не получил эту часть кода, поэтому мне нужно взять исходный код библиотеки и найти способ добавить префикс. к названиям символов.   -  person danielhauagge    schedule 15.04.2012


Ответы (2)


Я считаю, что этот ответ даст вам решение.

Короче говоря, вы можете «префиксировать» символы в существующей библиотеке, используя objcopy следующим образом:

objcopy --prefix-symbols=foo_ foo.o

person George Skoptsov    schedule 14.04.2012
comment
Это замечательно, если вы используете GNU, но что, если вы используете MSVC, IAR, Keil, Green Hills или любую дюжину других компиляторов? - person PeterT; 24.10.2018

* РЕДАКТИРОВАТЬ: решение Джорджа Скопцова лучше моего :) Однако трюк nm может пригодиться.


Это не совсем то, что вы ищете, но мне приходилось делать что-то подобное в прошлом (переименовывать символы, экспортируемые библиотекой).

Если вы знаете имена символов, которые хотите переопределить, вы можете попробовать использовать objcopy --redefine-syms old=new . См. справочные страницы objcopy для получения более подробной информации о вводе (objcopy может перезаписать ваш файл, поэтому будьте осторожны с этим)

Если вы не знаете названия символов, вы можете попробовать использовать nm, чтобы получить список символов. Опять же, поскольку я не уверен, какие символы вы ищете, справочные страницы, вероятно, будут вашим лучшим выбором.

person hide0    schedule 14.04.2012
comment
Мне нравится, что команда под названием objcopy на самом деле не создает копию. - person Puppy; 15.04.2012
comment
@DeadMG: он может создать копию (и делает это внутри), но очевидно, что модификация на месте - слишком полезная функция, чтобы не добавлять ее. :) - person ams; 16.04.2012