Some background on the original decision to ban static initializers:
http://neugierig.org/software/chromium/notes/2011/08/static-initializers.html
Note: Another name for static initializers is “global constructors”.
Common fixes include:
base::NoDestructor
.For Linux:
tools/linux/dump-static-initializers.py out/Release/chrome
For Android (from easiest to hardest):
# Build with: is_official_build=true is_chrome_branded=true # This will dump the list of SI's only when they don't match the expected # number in static_initializers.gni (this is what the bots use). ninja chrome/android:monochrome_static_initializers # or: tools/binary_size/diagnose_bloat.py HEAD # See README.md for flags. # or (the other two use this under the hood): tools/linux/dump-static-initializers.py --toolchain-prefix third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/arm-linux-androideabi- out/Release/lib.unstripped/libmonochrome.so # arm32 ^^ vv arm64 tools/linux/dump-static-initializers.py --toolchain-prefix third_party/android_ndk/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android- out/Release/lib.unstripped/libmonochrome.so # Note: For arm64, having use_thin_lto=true seems to dump a couple extra # initializers that don't actually exist.
The last one may actually be the easiest if you've already properly built libmonochrome.so
with is_official_build=true
.
If the source of the new initializers is not obvious from Step 1, you can ask the compiler to pinpoint the exact source line.
"//build/config/compiler:wglobal_constructors"
to default_compiler_configs
configs
in //base:base
treat_warnings_as_errors=false
diagnose_bloat.py
, refer to its README.mdIf the source of the new initializers is not revealed with dump-static-initializers.py
(e.g. for static initializers introduced in compiler-rt), there's a manual option.
llvm-readelf --hex-dump=.init_array ./lib.unstripped/libmonochrome_64.so
. It will yield an address range like 0x0917fd40 to 0x0918fd78.llvm-readelf --relocations ./lib/unstripped | grep 0x0917fd40
to obtain a result mapping each .init_array slot to a function address.000000000918fd40 0000000000000403 R_AARCH64_RELATIVE 51732f0
llvm-addr2line --functions -e ./lib.unstripped/libmonochrome_64.so 51732f0
__cxx_global_var_init ./../../buildtools/third_party/libc++/trunk/src/iostream.cpp:80