aboutsummaryrefslogtreecommitdiff
path: root/modutils/modutils-24.c
diff options
context:
space:
mode:
authorJames Byrne <james.byrne@origamienergy.com>2019-07-02 11:35:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-07-02 11:35:03 +0200
commit6937487be73cd4563b876413277a295a5fe2f32c (patch)
treef16cc9999a7c827891e6ec8d99c699fc791008ee /modutils/modutils-24.c
parentcaecfdc20d450686cd1f7e9b5f650322f894b3c2 (diff)
downloadbusybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.gz
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.bz2
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.zip
libbb: reduce the overhead of single parameter bb_error_msg() calls
Back in 2007, commit 0c97c9d43707 ("'simple' error message functions by Loic Grenie") introduced bb_simple_perror_msg() to allow for a lower overhead call to bb_perror_msg() when only a string was being printed with no parameters. This saves space for some CPU architectures because it avoids the overhead of a call to a variadic function. However there has never been a simple version of bb_error_msg(), and since 2007 many new calls to bb_perror_msg() have been added that only take a single parameter and so could have been using bb_simple_perror_message(). This changeset introduces 'simple' versions of bb_info_msg(), bb_error_msg(), bb_error_msg_and_die(), bb_herror_msg() and bb_herror_msg_and_die(), and replaces all calls that only take a single parameter, or use something like ("%s", arg), with calls to the corresponding 'simple' version. Since it is likely that single parameter calls to the variadic functions may be accidentally reintroduced in the future a new debugging config option WARN_SIMPLE_MSG has been introduced. This uses some macro magic which will cause any such calls to generate a warning, but this is turned off by default to avoid use of the unpleasant macros in normal circumstances. This is a large changeset due to the number of calls that have been replaced. The only files that contain changes other than simple substitution of function calls are libbb.h, libbb/herror_msg.c, libbb/verror_msg.c and libbb/xfuncs_printf.c. In miscutils/devfsd.c, networking/udhcp/common.h and util-linux/mdev.c additonal macros have been added for logging so that single parameter and multiple parameter logging variants exist. The amount of space saved varies considerably by architecture, and was found to be as follows (for 'defconfig' using GCC 7.4): Arm: -92 bytes MIPS: -52 bytes PPC: -1836 bytes x86_64: -938 bytes Note that for the MIPS architecture only an exception had to be made disabling the 'simple' calls for 'udhcp' (in networking/udhcp/common.h) because it made these files larger on MIPS. Signed-off-by: James Byrne <james.byrne@origamienergy.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'modutils/modutils-24.c')
-rw-r--r--modutils/modutils-24.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/modutils/modutils-24.c b/modutils/modutils-24.c
index 1a30dd87c..ac8632481 100644
--- a/modutils/modutils-24.c
+++ b/modutils/modutils-24.c
@@ -2600,7 +2600,7 @@ static void new_get_kernel_symbols(void)
2600 module_names = xrealloc(module_names, bufsize); 2600 module_names = xrealloc(module_names, bufsize);
2601 goto retry_modules_load; 2601 goto retry_modules_load;
2602 } 2602 }
2603 bb_perror_msg_and_die("QM_MODULES"); 2603 bb_simple_perror_msg_and_die("QM_MODULES");
2604 } 2604 }
2605 2605
2606 n_ext_modules = nmod = ret; 2606 n_ext_modules = nmod = ret;
@@ -2661,7 +2661,7 @@ static void new_get_kernel_symbols(void)
2661 syms = xrealloc(syms, bufsize); 2661 syms = xrealloc(syms, bufsize);
2662 goto retry_kern_sym_load; 2662 goto retry_kern_sym_load;
2663 } 2663 }
2664 bb_perror_msg_and_die("kernel: QM_SYMBOLS"); 2664 bb_simple_perror_msg_and_die("kernel: QM_SYMBOLS");
2665 } 2665 }
2666 nksyms = nsyms = ret; 2666 nksyms = nsyms = ret;
2667 ksyms = syms; 2667 ksyms = syms;
@@ -3247,21 +3247,21 @@ static struct obj_file *obj_load(char *image, size_t image_size, int loadprogbit
3247 f->load_order_search_start = &f->load_order; 3247 f->load_order_search_start = &f->load_order;
3248 3248
3249 if (image_size < sizeof(f->header)) 3249 if (image_size < sizeof(f->header))
3250 bb_error_msg_and_die("error while loading ELF header"); 3250 bb_simple_error_msg_and_die("error while loading ELF header");
3251 memcpy(&f->header, image, sizeof(f->header)); 3251 memcpy(&f->header, image, sizeof(f->header));
3252 3252
3253 if (*(aliased_uint32_t*)(&f->header.e_ident) != ELFMAG_U32) { 3253 if (*(aliased_uint32_t*)(&f->header.e_ident) != ELFMAG_U32) {
3254 bb_error_msg_and_die("not an ELF file"); 3254 bb_simple_error_msg_and_die("not an ELF file");
3255 } 3255 }
3256 if (f->header.e_ident[EI_CLASS] != ELFCLASSM 3256 if (f->header.e_ident[EI_CLASS] != ELFCLASSM
3257 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB) 3257 || f->header.e_ident[EI_DATA] != (BB_BIG_ENDIAN ? ELFDATA2MSB : ELFDATA2LSB)
3258 || f->header.e_ident[EI_VERSION] != EV_CURRENT 3258 || f->header.e_ident[EI_VERSION] != EV_CURRENT
3259 || !MATCH_MACHINE(f->header.e_machine) 3259 || !MATCH_MACHINE(f->header.e_machine)
3260 ) { 3260 ) {
3261 bb_error_msg_and_die("ELF file not for this architecture"); 3261 bb_simple_error_msg_and_die("ELF file not for this architecture");
3262 } 3262 }
3263 if (f->header.e_type != ET_REL) { 3263 if (f->header.e_type != ET_REL) {
3264 bb_error_msg_and_die("ELF file not a relocatable object"); 3264 bb_simple_error_msg_and_die("ELF file not a relocatable object");
3265 } 3265 }
3266 3266
3267 /* Read the section headers. */ 3267 /* Read the section headers. */
@@ -3280,7 +3280,7 @@ static struct obj_file *obj_load(char *image, size_t image_size, int loadprogbit
3280 3280
3281 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum); 3281 section_headers = alloca(sizeof(ElfW(Shdr)) * shnum);
3282 if (image_size < f->header.e_shoff + sizeof(ElfW(Shdr)) * shnum) 3282 if (image_size < f->header.e_shoff + sizeof(ElfW(Shdr)) * shnum)
3283 bb_error_msg_and_die("error while loading section headers"); 3283 bb_simple_error_msg_and_die("error while loading section headers");
3284 memcpy(section_headers, image + f->header.e_shoff, sizeof(ElfW(Shdr)) * shnum); 3284 memcpy(section_headers, image + f->header.e_shoff, sizeof(ElfW(Shdr)) * shnum);
3285 3285
3286 /* Read the section data. */ 3286 /* Read the section data. */
@@ -3317,16 +3317,16 @@ static struct obj_file *obj_load(char *image, size_t image_size, int loadprogbit
3317 if (sec->header.sh_size > 0) { 3317 if (sec->header.sh_size > 0) {
3318 sec->contents = xmalloc(sec->header.sh_size); 3318 sec->contents = xmalloc(sec->header.sh_size);
3319 if (image_size < (sec->header.sh_offset + sec->header.sh_size)) 3319 if (image_size < (sec->header.sh_offset + sec->header.sh_size))
3320 bb_error_msg_and_die("error while loading section data"); 3320 bb_simple_error_msg_and_die("error while loading section data");
3321 memcpy(sec->contents, image + sec->header.sh_offset, sec->header.sh_size); 3321 memcpy(sec->contents, image + sec->header.sh_offset, sec->header.sh_size);
3322 } 3322 }
3323 break; 3323 break;
3324#if SHT_RELM == SHT_REL 3324#if SHT_RELM == SHT_REL
3325 case SHT_RELA: 3325 case SHT_RELA:
3326 bb_error_msg_and_die("RELA relocations not supported on this architecture"); 3326 bb_simple_error_msg_and_die("RELA relocations not supported on this architecture");
3327#else 3327#else
3328 case SHT_REL: 3328 case SHT_REL:
3329 bb_error_msg_and_die("REL relocations not supported on this architecture"); 3329 bb_simple_error_msg_and_die("REL relocations not supported on this architecture");
3330#endif 3330#endif
3331 default: 3331 default:
3332 if (sec->header.sh_type >= SHT_LOPROC) { 3332 if (sec->header.sh_type >= SHT_LOPROC) {
@@ -3447,7 +3447,7 @@ static int obj_load_progbits(char *image, size_t image_size, struct obj_file *f,
3447 continue; 3447 continue;
3448 sec->contents = imagebase + (sec->header.sh_addr - base); 3448 sec->contents = imagebase + (sec->header.sh_addr - base);
3449 if (image_size < (sec->header.sh_offset + sec->header.sh_size)) { 3449 if (image_size < (sec->header.sh_offset + sec->header.sh_size)) {
3450 bb_error_msg("error reading ELF section data"); 3450 bb_simple_error_msg("error reading ELF section data");
3451 return 0; /* need to delete half-loaded module! */ 3451 return 0; /* need to delete half-loaded module! */
3452 } 3452 }
3453 memcpy(sec->contents, image + sec->header.sh_offset, sec->header.sh_size); 3453 memcpy(sec->contents, image + sec->header.sh_offset, sec->header.sh_size);
@@ -3845,7 +3845,7 @@ int FAST_FUNC bb_init_module_24(const char *m_filename, const char *options)
3845 if (m_has_modinfo) { 3845 if (m_has_modinfo) {
3846 int m_version = new_get_module_version(f, m_strversion); 3846 int m_version = new_get_module_version(f, m_strversion);
3847 if (m_version == -1) { 3847 if (m_version == -1) {
3848 bb_error_msg_and_die("can't find the kernel version " 3848 bb_simple_error_msg_and_die("can't find the kernel version "
3849 "the module was compiled for"); 3849 "the module was compiled for");
3850 } 3850 }
3851 } 3851 }
@@ -3864,7 +3864,7 @@ int FAST_FUNC bb_init_module_24(const char *m_filename, const char *options)
3864#endif 3864#endif
3865 3865
3866 if (query_module(NULL, 0, NULL, 0, NULL)) 3866 if (query_module(NULL, 0, NULL, 0, NULL))
3867 bb_error_msg_and_die("old (unsupported) kernel"); 3867 bb_simple_error_msg_and_die("old (unsupported) kernel");
3868 new_get_kernel_symbols(); 3868 new_get_kernel_symbols();
3869 k_crcs = new_is_kernel_checksummed(); 3869 k_crcs = new_is_kernel_checksummed();
3870 3870