Как предотвратить удаление определенных функций?

У меня есть статическая библиотека, которая содержит некоторые функции JNICALL, т.е. ожидается, что они будут вызываться из JVM, и на них никогда не ссылается общая библиотека, которая связывает статическую библиотеку.

Тем не менее, похоже, что удаление функции уничтожает функцию JNICALL (она не видна в arm-eabi-objdump -t). Я работаю над этим, добавляя фиктивную функцию с невозможным условием, которая вызывает функцию JNICALL, но это грязно. Я знаю, что есть опция ссылки, чтобы предотвратить удаление неиспользуемых данных некоторых модулей, но что это? И как указать эту опцию в файле .mk? Я не увидел ничего сразу очевидного в arm-eabi-ld.

Между прочим, удаление функции не удаляет функции JNICALL в самой разделяемой библиотеке, но удаляет те из статической библиотеки, на которую ссылается разделяемая библиотека. В чем причина этого?


person EboMike    schedule 29.08.2010    source источник
comment
Это только что появилось -- #3559733" title="предотвращение удаления функций из статической библиотеки при связывании с">stackoverflow.com/questions/3549432/   -  person fadden    schedule 31.08.2010
comment
И это, конечно, странно, мой личный ответ, парень :) Хочешь опубликовать это как вопрос, чтобы я мог его принять? (Ну, это, или я мог бы закрыть свой вопрос как дурак)   -  person EboMike    schedule 31.08.2010


Ответы (2)


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

Перейдите в каталог «build» в установке NDK и найдите все экземпляры LOCAL_STATIC_LIBRARIES. Скопируйте и вставьте их все и добавьте версию, которая делает то же самое с LOCAL_STATIC_WHOLE_LIBRARIES.

Чтобы быть точным: в build/core/build-binary.mk вам понадобятся:

LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES))
LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES))

[...]

static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES))
static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES))

[...]

$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES))
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES))

[...]

$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries)

[...]

$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries)
$(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries)

Обратите внимание на несоответствие между STATIC_WHOLE и WHOLE_STATIC — так оно и есть в NDK, я решил оставить его таким, хотя оно и противоречиво.

Теперь, наконец, в build/toolchains/arm-eabi-4.4.0/setup.mk: уже есть блок PRIVATE_WHOLE_STATIC_LIBRARIES для разделяемых библиотек. Вы также можете добавить это для исполняемых файлов, хотя это, скорее всего, не обязательно.

person EboMike    schedule 05.09.2010