Удаление символов из общей библиотеки с помощью objcopy ничего не делает

0

Проблема (1):
У меня есть общая библиотека shared1.so, которая использует статическую библиотеку static1.a.
У меня есть другая общая библиотека shared2.so.
shared2.so не может напрямую static1.a на static1.a из-за ограничения.
Я хочу, чтобы shared2.so использовал static1.a.

Мое решение
Я экспортировал функции static1.a в shared1.so, и теперь shared2.so использует функции static1.a, связываясь с shared1.so. Это работает нормально!
Однако в итоге все символы static1.a появились в shared1.so.

Проблема (2)
Как я могу избавиться от всех этих символов/функций, которые не используются shared2.so?
Я пытался:

arm-linux-androideabi-objcopy --strip-symbols symbols_of_static1_which_i_dont_use.txt shared1.so

однако он ничего не делает, никаких предупреждений (даже с -v).
Я также пробовал использовать arm-linux-androideabi-strip но он тоже ничего не снимает.

РЕДАКТИРОВАТЬ:

Таким образом, кажется, что strip пропускает только статические символы и не касается секции.dynsym. Я все еще ищу способ удалить все ненужные символы static1.a, которые теперь экспортируются в shared1.so

Теги:
android-ndk
shared-libraries
symbols

1 ответ

0
Лучший ответ

Однако в итоге все символы static1.a появились в shared1.so

Вы не объяснили, как вы связали shared1.so. Возможно, что, связывая умнее, вы могли бы избежать посторонних символов static1.a в shared1.so в первую очередь (это может быть предпочтительным для удаления символов из-за того, что, если дополнительные символы не используются, они просто shared1.so для нет веской причины).

1-я проблема все еще остается.

Но вы нашли решение для этого, не так ли?

strip пропускает только статические символы и не касается секции.dynsym

Это верно. После компоновки очень сложно изменить таблицу динамических символов, поскольку символы отображаются в хэш-таблицах.

Если вы хотите опустить определенные символы из shared1.so, и вы не можете избежать их связывания в первую очередь, то лучше всего использовать скрипт компоновщика, чтобы ограничить видимость символов только теми символами, которые вы хотите видеть. Пример.

Обновить:

Однако как я могу объединить это с использованием __attribute__ ((visibility ("default")))? Кажется, скрипт компоновщика переопределяет функции, которые я экспортировал с этим параметром.

Правильно: скрипт компоновщика переопределяет все.

Если вы уже используете атрибуты для управления видимостью символов, вы можете

  • добавьте __attribute__((visibility("hidden")) к символам, которые вы не хотите, или
  • скомпилировать с -fvisibility=hidden флаг.
  • 0
    Большое спасибо, используя скрипт компоновщика, мне удалось экспортировать только нужные функции. Однако, как мне совместить это с использованием __attribute__ ((visibility ("default"))) ? Кажется, скрипт компоновщика переопределяет функции, которые я экспортировал с этим параметром.
  • 0
    @HyBRiD Я обновил ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню