strip generated symbols from *.ko
PATCH 1/2 strip generated symbols from *.ko
This patch changes the way __crc_ symbols are being resolved from using ld to do so to using the assembler, thus allowing these symbols to be marked local (the linker creates then as global ones) and hence allow stripping (for modules) or ignoring (for vmlinux) them. While at this, also strip other generated symbols during module installation.
One potentially debatable point is the handling of the flags passeed to gcc when translating the intermediate assembly file into an object:
passing $(c_flags) unchanged doesn't work as gcc passes --gdwarf2 to gas whenever is sees any -g* option, even for -g0, and despite the fact that the compiler would have already produced all necessary debug info in the C->assembly translation phase. I took the approach of just filtering out all -g* options, but an alternative to such negative filtering might be to have a positive filter which might, in the ideal case allow just all the -Wa,* options to pass through.
--- Makefile | 16 ++++++------ scripts/Makefile.build | 55 ++++++++++++++++++++++++++++---------------- scripts/Makefile.modinst | 3 +- scripts/genksyms/genksyms.c | 21 ++++++++++++---- scripts/mksysmap | 7 +---- scripts/strip-symbols | 22 +++++++++++++++++ 6 files changed, 85 insertions(+), 39 deletions(-)
Makefile +8 -8
@@ -601,19 +601,19 @@ MODLIB = $(INSTALL_MOD_PATH)/lib/modules export MODLIB # -# INSTALL_MOD_STRIP, if defined, will cause modules to be -# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then -# the default option --strip-debug will be used. Otherwise, -# INSTALL_MOD_STRIP will used as the options to the strip command. - +# INSTALL_MOD_STRIP, if defined, will cause modules to be stripped while +# they get installed. If INSTALL_MOD_STRIP is '1', then the default +# options (see below) will be used. Otherwise, INSTALL_MOD_STRIP will +# be used as the option(s) to the objcopy command. ifdef INSTALL_MOD_STRIP ifeq ($(INSTALL_MOD_STRIP),1) -mod_strip_cmd = $(STRIP) --strip-debug +mod_strip_cmd = $(OBJCOPY) --strip-debug --strip-symbols \ + $(srctree)/scripts/strip-symbols --wildcard else -mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP) +mod_strip_cmd = $(OBJCOPY) $(INSTALL_MOD_STRIP) endif # INSTALL_MOD_STRIP=1 else -mod_strip_cmd = true +mod_strip_cmd = false endif # INSTALL_MOD_STRIP export mod_strip_cmd
scripts/Makefile.build +36 -19
73 lines not on this page · raw message
scripts/Makefile.modinst +2 -1
@@ -17,7 +17,8 @@ __modinst: $(modules) @: quiet_cmd_modules_install = INSTALL $@ - cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) + cmd_modules_install = mkdir -p $(2); \ + $(mod_strip_cmd) $@ $(2)/$(notdir $@) || cp $@ $(2) # Modules built outside the kernel source tree go into extra by default INSTALL_MOD_DIR ?= extra
scripts/genksyms/genksyms.c +15 -6
@@ -42,7 +42,7 @@ static FILE *debugfile;int cur_line =1 ;char *cur_filename; -static int flag_debug, flag_dump_defs, flag_dump_types, flag_warnings; +static int flag_debug, flag_dump_defs, flag_dump_types, flag_warnings, flag_asm;static const char *arch ="" ;static const char *mod_prefix ="" ;
@@ -415,8 +415,11 @@ void export_symbol(const char *name)if (flag_dump_defs)fputs (">\n" , debugfile); -/* Used as a linker script. */ -printf ("%s__crc_%s = 0x%08lx ;\n" , mod_prefix, name, crc); +/* Used as assembly source or a linker script. */ +printf (flag_asm + ?".equiv %s__crc_%s, %#08lx\n" + :"%s__crc_%s = %#08lx ;\n" , + mod_prefix, name, crc); } }
@@ -440,9 +443,10 @@ void error_with_pos(const char *fmt, ...static void genksyms_usage (void ) { -fputs ("Usage:\n" "genksyms [-adDTwqhV] > /path/to/.tmp_obj.ver\n" "\n" +fputs ("Usage:\n" "genksyms [-aAdDTwqhV] > /path/to/.tmp_obj.ver\n" "\n" #ifdef __GNU_LIBRARY__" -a, --arch Select architecture\n" +" -A, --asm Generate assembly rather than linker script\n" " -d, --debug Increment the debug level (repeatable)\n" " -D, --dump Dump expanded symbol defs (for debugging only)\n" " -T, --dump-types file Dump expanded types into file (for debugging only)\n"
@@ -452,6 +456,7 @@ static void genksyms_usage(void)" -V, --version Print the release version\n" #else /* __GNU_LIBRARY__ */" -a Select architecture\n" +" -A Generate assembly rather than linker script\n" " -d Increment the debug level (repeatable)\n" " -D Dump expanded symbol defs (for debugging only)\n" " -T file Dump expanded types into file (for debugging only)\n"
@@ -471,6 +476,7 @@ int main(int argc, char **argv)#ifdef __GNU_LIBRARY__struct option long_opts[] = { {"arch" ,1 ,0 ,'a' }, + {"asm" ,0 ,0 ,'A' }, {"debug" ,0 ,0 ,'d' }, {"warnings" ,0 ,0 ,'w' }, {"quiet", 0, 0, 'q'},
@@ -481,10 +487,10 @@ int main(int argc, char **argv) {0, 0, 0, 0} }; -while ((o =getopt_long (argc, argv,"a:dwqVDT:h" , +while ((o =getopt_long (argc, argv,"a:dwqVADT:h" , &long_opts[0 ],NULL )) !=EOF ) #else /* __GNU_LIBRARY__ */ - while ((o = getopt(argc, argv, "a:dwqVDT:h")) != EOF) + while ((o = getopt(argc, argv, "a:dwqVADT:h")) != EOF)#endif /* __GNU_LIBRARY__ */ switch (o) {case 'a' :
@@ -502,6 +508,9 @@ int main(int argc, char **argv)case 'V' :fputs ("genksyms version 2.5.60\n" , stderr);break ; +case 'A' : + flag_asm =1 ; +break ;case 'D' : flag_dump_defs =1 ;break ;
scripts/mksysmap +2 -5
@@ -37,9 +37,6 @@ # readprofile starts reading symbols when _stext is found, and # continue until it finds a symbol which is not either of 'T', 't', -# 'W' or 'w'. __crc_ are 'A' and placed in the middle -# so we just ignore them to let readprofile continue to work. -# (At least sparc64 has __crc_ in the middle). - -$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2 +# 'W' or 'w'. +$NM -n $1 | grep -v '\( [aNUw] \)\|\( \$[adt]\)' > $2
scripts/strip-symbols new file +22 -0
@@ -0,0 +1,22 @@ +<*> +*.h +__compound_literal[$.][0-9]* +__crc_[a-zA-Z_]* +__exitcall_[a-zA-Z_]* +__func__[$.][0-9]* +__FUNCTION__[$.][0-9]* +gcc[0-9]_compiled[$.] +__initcall_[a-zA-Z_]* +__kcrctab_[a-zA-Z_]* +__kstrtab_[a-zA-Z_]* +__ksymtab_[a-zA-Z_]* +__mod_[a-zA-Z_]*[0-9] +__module_depends +__param_[a-zA-Z_]* +__pci_fixup_*PCI_ANY_IDPCI_ANY_ID* +__pci_fixup_*PCI_ANY_IDPCI_DEVICE_ID_* +__pci_fixup_*PCI_VENDOR_ID_*PCI_ANY_ID* +__pci_fixup_*PCI_VENDOR_ID_*PCI_DEVICE_ID_* +__PRETTY_FUNCTION__[$.][0-9]* +__setup_[a-zA-Z_]* +____versions
Quoted 16 lines · Jan Beulich
This patch changes the way
__crc_symbols are being resolved from using ld to do so to using the assembler, thus allowing these symbols to be marked local (the linker creates then as global ones) and hence allow stripping (for modules) or ignoring (for vmlinux) them. While at this, also strip other generated symbols during module installation.One potentially debatable point is the handling of the flags passeed to gcc when translating the intermediate assembly file into an object:
passing $(c_flags) unchanged doesn't work as gcc passes --gdwarf2 to gas whenever is sees any -g* option, even for -g0, and despite the fact that the compiler would have already produced all necessary debug info in theC->assemblytranslation phase. I took the approach of just filtering out all -g* options, but an alternative to such negative filtering might be to have a positive filter which might, in the ideal case allow just all the -Wa,* options to pass through.
Quoted 1 line
Signed-off-by Jan Beulich <[email protected]>
Both patches are encoded so I end up with "=20", "=3D" in the saved file. Can you please resend as attachment or fix your mailer.
Thanks,
Sam
Quoted 16 lines · Jan Beulich
This patch changes the way
__crc_symbols are being resolved from using ld to do so to using the assembler, thus allowing these symbols to be marked local (the linker creates then as global ones) and hence allow stripping (for modules) or ignoring (for vmlinux) them. While at this, also strip other generated symbols during module installation.One potentially debatable point is the handling of the flags passeed to gcc when translating the intermediate assembly file into an object:
passing $(c_flags) unchanged doesn't work as gcc passes --gdwarf2 to gas whenever is sees any -g* option, even for -g0, and despite the fact that the compiler would have already produced all necessary debug info in theC->assemblytranslation phase. I took the approach of just filtering out all -g* options, but an alternative to such negative filtering might be to have a positive filter which might, in the ideal case allow just all the -Wa,* options to pass through.
Quoted 1 line
Signed-off-by Jan Beulich <[email protected]>
I had to edit the patch slightly to apply it to kbuild-next - see below. It was only in Makefile.build I edited the patch.
Both patches are now applied and pushed out.
Sam
commit ad7a953c522ceb496611d127e51e278bfe0ff483
Author: Jan Beulich <[email protected]> Date: Tue Dec 16 11:28:14 2008 +0000
kbuild: strip generated symbols from *.ko
This patch changes the way __crc_ symbols are being resolved from using ld to do so to using the assembler, thus allowing these symbols to be marked local (the linker creates then as global ones) and hence allow stripping (for modules) or ignoring (for vmlinux) them. While at this, also strip other generated symbols during module installation.
One potentially debatable point is the handling of the flags passeed to gcc when translating the intermediate assembly file into an object:
passing $(c_flags) unchanged doesn't work as gcc passes --gdwarf2 to gas whenever is sees any -g* option, even for -g0, and despite the fact that the compiler would have already produced all necessary debug info in the C->assembly translation phase. I took the approach of just filtering out all -g* options, but an alternative to such negative filtering might be to have a positive filter which might, in the ideal case allow just all the -Wa,* options to pass through.
Makefile +8 -8
@@ -605,19 +605,19 @@ MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE) export MODLIB # -# INSTALL_MOD_STRIP, if defined, will cause modules to be -# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then -# the default option --strip-debug will be used. Otherwise, -# INSTALL_MOD_STRIP will used as the options to the strip command. - +# INSTALL_MOD_STRIP, if defined, will cause modules to be stripped while +# they get installed. If INSTALL_MOD_STRIP is '1', then the default +# options (see below) will be used. Otherwise, INSTALL_MOD_STRIP will +# be used as the option(s) to the objcopy command. ifdef INSTALL_MOD_STRIP ifeq ($(INSTALL_MOD_STRIP),1) -mod_strip_cmd = $(STRIP) --strip-debug +mod_strip_cmd = $(OBJCOPY) --strip-debug --strip-symbols \ + $(srctree)/scripts/strip-symbols --wildcard else -mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP) +mod_strip_cmd = $(OBJCOPY) $(INSTALL_MOD_STRIP) endif # INSTALL_MOD_STRIP=1 else -mod_strip_cmd = true +mod_strip_cmd = false endif # INSTALL_MOD_STRIP export mod_strip_cmd
scripts/Makefile.build +35 -20
86 lines not on this page · raw message
scripts/Makefile.modinst +2 -1
@@ -17,7 +17,8 @@ __modinst: $(modules) @: quiet_cmd_modules_install = INSTALL $@ - cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) + cmd_modules_install = mkdir -p $(2); \ + $(mod_strip_cmd) $@ $(2)/$(notdir $@) || cp $@ $(2) # Modules built outside the kernel source tree go into extra by default INSTALL_MOD_DIR ?= extra
scripts/genksyms/genksyms.c +15 -6
@@ -43,7 +43,7 @@ int cur_line = 1;char *cur_filename;static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types, - flag_preserve, flag_warnings; + flag_preserve, flag_warnings, flag_asm;static const char *arch ="" ;static const char *mod_prefix ="" ;
@@ -610,8 +610,11 @@ void export_symbol(const char *name)if (flag_dump_defs)fputs (">\n" , debugfile); -/* Used as a linker script. */ -printf ("%s__crc_%s = 0x%08lx ;\n" , mod_prefix, name, crc); +/* Used as assembly source or a linker script. */ +printf (flag_asm + ?".equiv %s__crc_%s, %#08lx\n" + :"%s__crc_%s = %#08lx ;\n" , + mod_prefix, name, crc); } }
@@ -648,9 +651,10 @@ void error_with_pos(const char *fmt, ...)static void genksyms_usage (void ) { -fputs ("Usage:\n" "genksyms [-adDTwqhV] > /path/to/.tmp_obj.ver\n" "\n" +fputs ("Usage:\n" "genksyms [-aAdDTwqhV] > /path/to/.tmp_obj.ver\n" "\n" #ifdef __GNU_LIBRARY__" -a, --arch Select architecture\n" +" -A, --asm Generate assembly rather than linker script\n" " -d, --debug Increment the debug level (repeatable)\n" " -D, --dump Dump expanded symbol defs (for debugging only)\n" " -r, --reference file Read reference symbols from a file\n"
@@ -662,6 +666,7 @@ static void genksyms_usage(void)" -V, --version Print the release version\n" #else /* __GNU_LIBRARY__ */" -a Select architecture\n" +" -A Generate assembly rather than linker script\n" " -d Increment the debug level (repeatable)\n" " -D Dump expanded symbol defs (for debugging only)\n" " -r file Read reference symbols from a file\n"
@@ -683,6 +688,7 @@ int main(int argc, char **argv)#ifdef __GNU_LIBRARY__struct option long_opts[] = { {"arch" ,1 ,0 ,'a' }, + {"asm" ,0 ,0 ,'A' }, {"debug" ,0 ,0 ,'d' }, {"warnings" ,0 ,0 ,'w' }, {"quiet", 0, 0, 'q'},
@@ -695,10 +701,10 @@ int main(int argc, char **argv) {0, 0, 0, 0} }; -while ((o =getopt_long (argc, argv,"a:dwqVDr:T:ph" , +while ((o =getopt_long (argc, argv,"a:dwqVADr:T:ph" , &long_opts[0 ],NULL )) !=EOF ) #else /* __GNU_LIBRARY__ */ - while ((o = getopt(argc, argv, "a:dwqVDr:T:ph")) != EOF) + while ((o = getopt(argc, argv, "a:dwqVADr:T:ph")) != EOF)#endif /* __GNU_LIBRARY__ */ switch (o) {case 'a' :
@@ -716,6 +722,9 @@ int main(int argc, char **argv)case 'V' :fputs ("genksyms version 2.5.60\n" , stderr);break ; +case 'A' : + flag_asm =1 ; +break ;case 'D' : flag_dump_defs =1 ;break ;
scripts/mksysmap +2 -5
@@ -37,9 +37,6 @@ # readprofile starts reading symbols when _stext is found, and # continue until it finds a symbol which is not either of 'T', 't', -# 'W' or 'w'. __crc_ are 'A' and placed in the middle -# so we just ignore them to let readprofile continue to work. -# (At least sparc64 has __crc_ in the middle). - -$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2 +# 'W' or 'w'. +$NM -n $1 | grep -v '\( [aNUw] \)\|\( \$[adt]\)' > $2
scripts/strip-symbols new file +22 -0
@@ -0,0 +1,22 @@ +<*> +*.h +__compound_literal[$.][0-9]* +__crc_[a-zA-Z_]* +__exitcall_[a-zA-Z_]* +__func__[$.][0-9]* +__FUNCTION__[$.][0-9]* +gcc[0-9]_compiled[$.] +__initcall_[a-zA-Z_]* +__kcrctab_[a-zA-Z_]* +__kstrtab_[a-zA-Z_]* +__ksymtab_[a-zA-Z_]* +__mod_[a-zA-Z_]*[0-9] +__module_depends +__param_[a-zA-Z_]* +__pci_fixup_*PCI_ANY_IDPCI_ANY_ID* +__pci_fixup_*PCI_ANY_IDPCI_DEVICE_ID_* +__pci_fixup_*PCI_VENDOR_ID_*PCI_ANY_ID* +__pci_fixup_*PCI_VENDOR_ID_*PCI_DEVICE_ID_* +__PRETTY_FUNCTION__[$.][0-9]* +__setup_[a-zA-Z_]* +____versions