Skip to content

NDK 18 hide symbols #829

Closed
Closed
@huangqinjin

Description

@huangqinjin

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.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions