linux - How to decrease the size of generated binaries? -
i know there option "-os" "optimize size", has little affect, or increase size on occasion :(
strip (or "-s" option) removes debug symbol table, works fine; can decrease small propotion of size.
is there other way go furthur?
apart obvious (-os -s), aligning functions smallest possible value not crash (i don't know arm alignment requirements) might squeeze out few bytes per function.
-os should disable aligning functions, might still default value 4 or 8. if aligning e.g. 1 possible arm, might save bytes.
-ffast-math (or less abrasive -fno-math-errno) not set errno , avoid checks, reduces code size. if, people, don't read errno anyway, that's option.
properly using __restrict (or restrict) , const removes redundant loads, making code both faster , smaller (and more correct). marking pure functions such eleminates function calls.
enabling lto may help, , if not available, compiling source files binary in 1 go (gcc foo.c bar.c baz.c -o program instead of compiling foo.c, bar.c, , baz.c object files first , linking) have similar effect. makes visible optimizer @ 1 time, possibly allowing work better.
-fdelete-null-pointer-checks may option (note enabled "o", not on embedded targets).
putting static globals (you don't have many, still) struct can eleminate a lot of overhead initializing them. learned when writing first opengl loader. having function pointers in struct , initializing struct = {} generates 1 call memset, whereas initializing pointers "normal way" generates hundred kilobytes of code set each 1 0 individually.
avoid non-trivial-constructor static local variables devil (pod types no problem). gcc initialize non-trivial-constructor static locals threadsafe unless compile -fno-threadsafe-statics, links in a lot of code (even if don't use threads @ all).
using libowfat instead of normal crt can greatly reduce binary size.
Comments
Post a Comment