Во время работы над библиотекой JNI для Android я столкнулся с проблемой, которую я могу воспроизвести с помощью clang из NDK r19b и следующих MWE:
void firstFunctionSymbol() {}
template <class Y>
class T {
public:
T(Y){};
};
T<int> test() {
return {1};
}
int main(){
return 0;
}
При компиляции и проверке этого с помощью:
$ android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/\
armv7a-linux-androideabi26-clang++ -g -c main.cpp -o main.o
$ android-ndk-r19b/toolchains/arm-linux-androideabi-4.9/prebuilt/\
linux-x86_64/arm-linux-androideabi/bin/objdump -DS main.o --demangle
Я получаю следующий вывод:
00000000 <firstFunctionSymbol()>:
void firstFunctionSymbol() {}
0: e12fff1e bx lr
00000004 <test()>:
class T {
public:
T(Y){};
};
T<int> test() {
4: e92d4800 push {fp, lr}
8: e1a0b00d mov fp, sp
c: e24dd008 sub sp, sp, #8
return {1};
10: e28d0004 add r0, sp, #4
14: e3001001 movw r1, #1
18: ebfffffe bl 0 <firstFunctionSymbol()>
1c: e58d0000 str r0, [sp]
20: e1a0d00b mov sp, fp
24: e8bd8800 pop {fp, pc}
Обратите внимание, как строка 18 ссылается на firstFunctionSymbol вместо ожидаемого T<int>(int)
.
Я делаю что-то не так или происходит сбой лязгаменя здесь?
Обратите внимание:
- это не проблема в GCC для arm или clang на x86
- эта проблема возникает только когда
T(Y){}
являетсяфункция, которая должна быть встроена.Например, определяя extern template class T<int>;
перед функцией, символ указывает на правильную точку.