1

Why does adding the below struct to my public header cause my android binary size (libMyLibrary.so) to increase by 4KB?

#define EXPORT __attribute__((visibility("default")))
struct EXPORT ITest
{
    inline static const std::string TestString   = "TestString";
};

Using nm wasn't very helpful as it only gave me two entries corresponding to that which only added to about 32Bytes. On investigating further with readelf it is evident that the .text Section Header increased by 4KB. That's a lot for just those small lines of code. What would be the reason or how would I investigate further?

Below are the compiler and linker flags that I use:

target_compile_options(${PROJECT_NAME} PRIVATE
        $<$<CONFIG:RELEASE>: -g0
                -Oz
                -fvisibility=hidden
                -fvisibility-inlines-hidden
                -fno-rtti
                -fno-unwind-tables
                -fno-exceptions
                -fno-omit-frame-pointer>
                -Wno-null-conversion
)

target_link_options(${PROJECT_NAME} PRIVATE
        $<$<CONFIG:RELEASE>: -g0
                -Wl,--exclude-libs,ALL
                -Wl,--gc-sections
                -WX-,--icf=safe
                -Wl,--strip-all>
)

Output of readelf

There are 24 section headers, starting at offset 0xd5208:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .note.gnu.build-id NOTE            0000000000000200 000200 000024 00   A  0   0  4
  [ 2] .gnu.hash         GNU_HASH        0000000000000228 000228 000c58 00   A  3   0  8
  [ 3] .dynsym           DYNSYM          0000000000000e80 000e80 003048 18   A  4   3  8
  [ 4] .dynstr           STRTAB          0000000000003ec8 003ec8 008131 00   A  0   0  1
  [ 5] .gnu.version      VERSYM          000000000000bffa 00bffa 000406 02   A  3   0  2
  [ 6] .gnu.version_r    VERNEED         000000000000c400 00c400 000020 00   A  4   1  8
  [ 7] .rela.dyn         RELA            000000000000c420 00c420 00ead8 18   A  3   0  8
  [ 8] .rela.plt         RELA            000000000001aef8 01aef8 000df8 18  AI  3  19  8
  [ 9] .plt              PROGBITS        000000000001bcf0 01bcf0 000970 10  AX  0   0 16
  [10] .text             PROGBITS        000000000001c660 01c660 0acb14 00  AX  0   0  4
  [11] .rodata           PROGBITS        00000000000c9180 0c9180 004852 00   A  0   0 16
  [12] .eh_frame_hdr     PROGBITS        00000000000cd9d4 0cd9d4 000064 00   A  0   0  4
  [13] .eh_frame         PROGBITS        00000000000cda38 0cda38 0001c8 00   A  0   0  8
  [14] .note.android.ident NOTE            00000000000cdc00 0cdc00 000098 00   A  0   0  4
  [15] .init_array       INIT_ARRAY      00000000000cf448 0ce448 000118 08  WA  0   0  8
  [16] .fini_array       FINI_ARRAY      00000000000cf560 0ce560 000010 08  WA  0   0  8
  [17] .data.rel.ro      PROGBITS        00000000000cf570 0ce570 006220 00  WA  0   0  8
  [18] .dynamic          DYNAMIC         00000000000d5790 0d4790 000200 10  WA  4   0  8
  [19] .got              PROGBITS        00000000000d5990 0d4990 000670 08  WA  0   0  8
  [20] .data             PROGBITS        00000000000d6000 0d5000 000040 00  WA  0   0  8
  [21] .bss              NOBITS          00000000000d6040 0d5040 0012c0 00  WA  0   0  8
  [22] .comment          PROGBITS        0000000000000000 0d5040 0000dc 01  MS  0   0  1
  [23] .shstrtab         STRTAB          0000000000000000 0d511c 0000e9 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  p (processor specific)

Symbol table '.dynsym' contains 515 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000000000001c660     0 SECTION LOCAL  DEFAULT   10 
     2: 00000000000cf570     0 SECTION LOCAL  DEFAULT   17 
     3: 00000000000d6040     0 NOTYPE  LOCAL  DEFAULT  ABS __bss_start__
     4: 00000000000d7300     0 NOTYPE  LOCAL  DEFAULT  ABS __end__
     5: 00000000000d7300     0 NOTYPE  LOCAL  DEFAULT  ABS __bss_end__
     6: 00000000000d6040     0 NOTYPE  LOCAL  DEFAULT  ABS __bss_start
     7: 00000000000d7300     0 NOTYPE  LOCAL  DEFAULT  ABS _bss_end__
     8: 00000000000d7300     0 NOTYPE  LOCAL  DEFAULT  ABS _end
     9: 00000000000d6040     0 NOTYPE  LOCAL  DEFAULT  ABS _edata
   ......
   213: 0000000000042eb8   144 FUNC    GLOBAL DEFAULT   10 <Hidden>
   214: 00000000000d6248    24 OBJECT  WEAK   DEFAULT   21 _ZN9Namespace5ITest10TestStringE
   215: 0000000000038a68   232 FUNC    GLOBAL DEFAULT   10 <Hidden>
.....
   327: 0000000000070728    60 FUNC    WEAK   DEFAULT   10 <Hidden>
   328: 00000000000d6260     8 OBJECT  WEAK   DEFAULT   21 _ZGVN9Namespace5ITest10TestStringE
   329: 00000000000ba8b8   156 FUNC    GLOBAL DEFAULT   10 <Hidden>
.....
   514: 0000000000040408    84 FUNC    GLOBAL DEFAULT   10 <Hidden>
rstr1112
  • 308
  • 4
  • 13
  • 2
    Please show the readelf output. Does the value you refer to maybe simply have only (4KB) page granularity? Then you might just be unlucky to get over the page boundary. – user17732522 Feb 26 '23 at 23:47
  • @user17732522 Could you elaborate. Why would page granularity affect disk footprint? I get that it might affect the in memory size consumed? Also what flags do you want turned on with readelf? I'll have to create a different sample program to provide full dump. On it. – rstr1112 Feb 26 '23 at 23:59
  • Just `-S` for now, since you say that the difference is visible in the section headers. Of course difference in the output with `-s` are also of interest... – user17732522 Feb 27 '23 at 00:07
  • @user17732522 I've updated it after hiding some of the rows – rstr1112 Feb 27 '23 at 00:38
  • 2
    I was more interested in how the values are different without the struct. – user17732522 Feb 27 '23 at 00:45
  • The text section is 707,432 bytes, which itself is not a multiple of 4k, but clearly something internally is page-aligned. – Mooing Duck Feb 27 '23 at 01:17

0 Answers0