Проблема (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
Однако в итоге все символы 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
флаг.
__attribute__ ((visibility ("default")))
? Кажется, скрипт компоновщика переопределяет функции, которые я экспортировал с этим параметром.