Различное поведение переопределения слабой функции в разделяемой библиотеке между OS X и Android
Я сталкиваюсь с другим поведением между OS X и Android:
Есть слабая функцияfoo
в моей общей библиотеке,Я хочу переопределить его сильной функцией, определенной в моем исполняемом файле.Я ожидаю, что переопределенные также влияют на вызов внутри библиотекиРезультат: я получил ожидаемый результат на OS X, но потерпел неудачу на Android.
Вот мой тестовый проект:
Файл: shared.h
void library_call_foo();
void __attribute__((weak)) foo();
Файл: shared.c
#include "shared.h"
#include <stdio.h>
void library_call_foo()
{
printf("shared library call foo -> ");
foo();
}
void foo()
{
printf("weak foo in library\n");
}
Файл: main.c
#include <stdio.h>
#include <shared.h>
void foo()
{
printf("strong foo in main\n");
}
int main()
{
library_call_foo();
printf("main call foo -> ");
foo();
return 0;
}
Я компилирую и запускаю его в OS X, используя команды:
clang -shared -fPIC -o libshared.so shared.c
clang -I. -L. -lshared -o test main.c
./test
которые возвращают результаты, как я ожидал:
shared library call foo -> strong foo in main
main call foo -> strong foo in main
Но когда я компилирую его для Android с NDK, использую те же команды:
arm-linux-androideabi-clang -shared -fPIC -o libshared.so shared.c
arm-linux-androideabi-clang -I. -L. -lshared -o test main.c
и запустить его на устройстве, я получил разные результаты:
shared library call foo -> weak foo in library
main call foo -> strong foo in main
Почему поведение отличается, и как я могу это исправить?