2014-09-09 1 views
0

У меня проблема с моими глобальными символами. У меня есть класс, который скомпилирован с видимостью по умолчанию (остальная часть кода скрыта) и no-inline. Исполняемый файл также связан с флагом -E. Этот класс вызывается из библиотеки, загружаемой dlopen; поэтому его символы должны быть GLOBAL.Глобальные символы становятся локальными по ссылке

Когда я смотрю на файл .o, все выглядит нормально: FUNC GLOBAL DEFAULT

Однако в конечном двоичном, та же функция превращается в это: FUNC LOCAL DEFAULT

Я думаю, ГЦ-секции вызывает это, и я не могу позволить себе не использовать его. Есть ли способ сказать gc-section игнорировать публичные API?

+0

Вы не предоставили достаточную информацию, чтобы ответить на ваш вопрос. Отсутствуют части: какой компоновщик (золотой или ld), какая версия, какая строка командной строки компоновщика, есть ли скрипты компоновщика, и если да, то что они содержат? –

+0

На данный момент я считаю, что это ошибка компоновщика. В binutils bugzilla есть несколько связанных с gc-разделов ошибок; и я думаю, что ударяю одного из них. Я пробовал одну и ту же линию ссылок с очень новой версией toolchain, и она работала так, как я ожидал. –

ответ

0

Однако в конечном двоичном, та же функция превращается в это: FUNC МЕСТНОГО DEFAULT

Это, скорее всего, происходит потому, что у вас есть что-то в командной строке компоновщика, который говорит линкер, чтобы сделать это. Возможно, у вас есть сценарий версии компоновщика, который это делает?

Я думаю, ГЦ-секция вызывает этот

Это предположение весьма маловероятно.

Смежные вопросы