Closed
Description
I create a simple project with android studio 3.2.1 (with latest ndk) including c++ support. Add the following code to native-lib.cpp
:
#define HIDDEN __attribute__((visibility("hidden")))
HIDDEN int FLAGS_hello = 1;
HIDDEN int FLAGS_world = 2;
extern "C" JNIEXPORT int helloworld() { return FLAGS_hello + FLAGS_world; }
Run readelf -s libnative-lib.so | grep FLAGS
for all ABIs and Debug/Release variants, I got the following output:
Debug:
armeabi-v7a:
8482: 00019004 4 OBJECT LOCAL HIDDEN 20 FLAGS_hello
8483: 00019008 4 OBJECT LOCAL HIDDEN 20 FLAGS_world
arm64-v8a:
1634: 0000000000044008 4 OBJECT LOCAL DEFAULT 20 FLAGS_hello
1666: 000000000004400c 4 OBJECT LOCAL DEFAULT 20 FLAGS_world
x86:
6697: 00032004 4 OBJECT LOCAL HIDDEN 22 FLAGS_hello
6698: 00032008 4 OBJECT LOCAL HIDDEN 22 FLAGS_world
x86_64:
551: 0000000000036008 4 OBJECT LOCAL HIDDEN 22 FLAGS_hello
552: 000000000003600c 4 OBJECT LOCAL HIDDEN 22 FLAGS_world
Release:
armeabi-v7a:
4: 00019004 4 OBJECT GLOBAL DEFAULT 20 FLAGS_hello
5: 00019008 4 OBJECT GLOBAL DEFAULT 20 FLAGS_world
8549: 00019004 4 OBJECT GLOBAL DEFAULT 20 FLAGS_hello
8550: 00019008 4 OBJECT GLOBAL DEFAULT 20 FLAGS_world
arm64-v8a:
1549: 0000000000041008 4 OBJECT LOCAL DEFAULT 20 FLAGS_hello
1579: 000000000004100c 4 OBJECT LOCAL DEFAULT 20 FLAGS_world
x86:
5601: 0002f004 4 OBJECT LOCAL HIDDEN 22 FLAGS_hello
5602: 0002f008 4 OBJECT LOCAL HIDDEN 22 FLAGS_world
x86_64:
544: 0000000000033008 4 OBJECT LOCAL HIDDEN 22 FLAGS_hello
545: 000000000003300c 4 OBJECT LOCAL HIDDEN 22 FLAGS_world
Symbols were not hidden in Release + armeabi-v7a
. But if I replace helloworld()
with
extern "C" JNIEXPORT int helloworld() { return FLAGS_hello; }
then same output got as Debug mode. I'm also confused with the Visibility of arm64-v8a
being DEFAULT
rather than HIDDEN
.