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:
# 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, to dump directly: tools/linux/dump-static-initializers.py out/Release/lib.unstripped/libmonochrome.so
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.mdYou can manually go through the steps that dump-static-initializers.py
does.
$ third_party/llvm-build/Release+Asserts/bin/llvm-readelf \ --hex-dump=.init_array out/Release/lib.unstripped/libmonochrome.so Hex dump of section '.init_array': 0x04064624 294a1a02 154acb00 79d3be01 894c1a02 )J...J..y....L..
0x04064624
is the location of .init_array
.# Reverse hex pairs to account for endianness. $ third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer \ --functions -e out/Release/lib.unstripped/libmonochrome.so 0x021a4a29 _GLOBAL__I_000101 ./../../buildtools/third_party/libc++/trunk/src/iostream.cpp:0:0
.init_array
slots are zero, that means they their address is exists within the relocation table. To find the address:# Use the location of ".init_array" printed in step 1, plus an offset for subsequent slots. $ third_party/llvm-build/Release+Asserts/bin/llvm-readelf \ --relocations out/Release/lib.unstripped/libmonochrome.so | grep 0x04064624 03dfb7b0 00000017 R_ARM_RELATIVE 0