Преобразовать разделяемую библиотеку в статическую библиотеку?

#c #c

#c #c

Вопрос:

Возможно ли преобразовать разделяемую библиотеку (someLib.so ) в статическую библиотеку? (someLib.a)

Комментарии:

1. Зачем это делать в первую очередь? Просто чтобы воспользоваться преимуществами статической библиотеки по сравнению с разделяемой библиотекой?

2. @мягко говоря, проблема с разделяемыми библиотеками заключается в том, что они более подвержены проблемам безопасности, либо из-за замены разделяемой библиотеки вредоносной версией, которая затем загружается в ваше приложение во время выполнения, либо из-за того, что два приложения используют один и тот же код, и если одному каким-то образом удастся изменить код, это повлияет на другое.

3. @RobGilliam вы также можете сказать с точностью до наоборот — наличие общей библиотеки означает, что ее можно заменить, если вы обнаружите проблему с безопасностью, и если она была статически связана, вы застряли с этой проблемой безопасности.

4. iOS не допускает вложенных зависимостей, поэтому преобразование общей библиотеки в статическую (если бы это было возможно) могло бы быть выгодным для разработчиков библиотек, чтобы упростить использование их библиотеки (вместо того, чтобы включать mylib.framework И dependency.framework , вы просто включаете mylib.framework , и зависимость является ее частью)

Ответ №1:

Нет. (По крайней мере, для разделяемой библиотеки ELF). Разделяемая библиотека — это простой объект (так расшифровывается разделяемый объект). Статическая библиотека — это коллекция объектов. В процессе создания разделяемой библиотеки вы объединяете несколько объектов и теряете часть информации, которая была бы необходима для их извлечения.

Комментарии:

1. Просто для интереса — какая необходимая информация теряется? Эти «внутренние объекты» по-прежнему «могут вызываться» — и с учетом соответствующих сведений о вызове, чего не хватает?

2. Имя объединенных объектов является наиболее очевидным кандидатом. Возможно, что при наличии отладочной информации у вас будет достаточно информации, чтобы решить головоломку и реконструировать все, но наверняка это не было целью формата.

3. Хорошо, это кажется интересным. Но знаете ли вы, что есть инструменты, которые говорят, что они могут конвертировать из динамического в статический? (Без исходного кода)

4. Поскольку я не могу отредактировать свой последний комментарий — что было бы, если бы у кого-то были .dll,.lib и .exp (для случая Windows) — возможно ли это тогда?

5. @AProgrammer Было бы возможно, если бы мне не нужны имена объектов? Например, теоретически должно быть возможно извлечь puts функцию из libc.so.6 as puts.o , поскольку известны точный адрес точки входа в функцию и путь к коду (т. Е. последовательность инструкций). Если нет, то что является препятствием?

Ответ №2:

ДА, если у вас есть исходный код разделяемой библиотеки.

НЕТ, если у вас нет исходного кода разделяемой библиотеки.

Комментарии:

1. Не могли бы вы объяснить, почему, хотя бы схематично?

2. У меня есть исходный код для разделяемой библиотеки. Я хочу использовать для разработки мобильных приложений iOS. Не могли бы вы, пожалуйста, рассказать мне о шагах по преобразованию разделяемой библиотеки в статическую библиотеку (.a).

3. Зачем вам вообще нужна разделяемая библиотека, если у вас есть исходный код?

4. Вау, какой отличный и информативный ответ. Невероятно