Предотвращение удаления функций из статической библиотеки при связывании с общей библиотекой?

У меня есть статическая библиотека Foo, которая используется общей библиотекой Bar. Bar - это встроенная общая библиотека, загружаемая моим приложением для Android. Foo содержит функции JNI, которые вызываются только кодом Java, а не кодом C ++ в Bar. Из-за этого эти функции JNI удаляются из статической библиотеки (Foo) при создании разделяемой библиотеки (Bar). Я' В настоящее время я использую слегка хакерский метод, чтобы предотвратить это.

Так, в этом случае, есть ли способ сказать компилятору, чтобы он не удалял функции JNI (или любые другие) при связывании?

7
задан djcouchycouch 23 August 2010 в 16:10
поделиться

1 ответ

Их не раздевают, их игнорируют. Когда разделяемая библиотека связана, компоновщик извлекает только объектные файлы с фактически используемыми функциями. (Именно так определяются статические библиотеки для работы.)

Я считаю, что передача компоновщику флага «--whole-archive» заставит его получить все объектные файлы из статической библиотеки. Вы можете указать его в строке ссылки gcc с помощью "-Wl, -whole-archive". Вам нужно следовать за ним с помощью «-Wl, -no-all-archive» после указания вашей библиотеки, иначе ld продолжит поведение для любых других статических библиотек, с которыми он сталкивается, что, вероятно, не то поведение, которое вы хотите. См. Также справочную страницу ld (1) в системе Linux.

Другой способ сделать то же самое - вывести один массивный файл .o вместо файла .a.

РЕДАКТИРОВАТЬ: Простой пример командной строки с использованием libz на рабочем столе:

% echo "int main() { return 0; }" > foo.c
% gcc -o foo /usr/lib/libz.a foo.c
% ls -s foo
12 foo*
% gcc -o foo -Wl,-whole-archive /usr/lib/libz.a -Wl,-no-whole-archive foo.c
% ls -s foo
104 foo*

(Здесь вы должны использовать «/usr/lib/libz.a» вместо «-lz», потому что последний находит общую библиотеку / usr / lib / libz .so.)

Я нечасто использовал NDK, но похоже, что добавление флагов к LOCAL_LDFLAGS может помочь.

7
ответ дан 6 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: