lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <200907011546.21597.rusty@rustcorp.com.au>
Date:	Wed, 1 Jul 2009 15:46:21 +0930
From:	Rusty Russell <rusty@...tcorp.com.au>
To:	"Jan Beulich" <JBeulich@...ell.com>
Cc:	linux-kernel@...r.kernel.org
Subject: Re: [PATCH 1/2] reduce symbol table for loaded modules

On Tue, 30 Jun 2009 09:38:43 pm Jan Beulich wrote:
> Discard all symbols not interesting for kallsyms use: absolute,
> section, and in the common case (!KALLSYMS_ALL) data ones.

I like the idea, but implementation could probably be polished a little bit.

> +static unsigned int filter_symbols(Elf_Sym *dst,
> +				   const Elf_Sym *src, unsigned int nsrc,
> +				   const Elf_Shdr *sechdrs, unsigned int shnum)

How about splitting the test out to an:

	bool is_core_symbol(const Elf_Sym *src, const Elf_Shdr *sechdrs, unsigned int shnum)

Then split filter_symbols into num_core_symbols() and copy_core_symbols().

> +static unsigned long layout_symtab(struct module *mod,

How about append_symbols() instead?

> +				   Elf_Shdr *sechdrs,
> +				   unsigned int symindex,
> +				   const Elf_Ehdr *hdr,
> +				   const char *secstrings)
> +{
> +	unsigned long symoffs;
> +	Elf_Shdr *symsect = sechdrs + symindex;
> +

Comment would help me here:

/* Put symbol section at end of init part of module. */
> +	symsect->sh_flags |= SHF_ALLOC;
> +	symsect->sh_entsize = get_offset(mod, &mod->init_size, symsect,
> +					 symindex) | INIT_OFFSET_MASK;
> +	DEBUGP("\t%s\n", secstrings + symsect->sh_name);
> +

Here too:
/* Append room for core symbols at end of core part. */
> +	symoffs = ALIGN(mod->core_size, symsect->sh_addralign ?: 1);
> +	mod->core_size = symoffs
> +			 + filter_symbols(NULL,
> +			 		  (void *)hdr + symsect->sh_offset,
> +					  symsect->sh_size / sizeof(Elf_Sym),
> +					  sechdrs, hdr->e_shnum)
> +			 * sizeof(Elf_Sym);
> +
> +	return symoffs;
> +}
> +
>  static void add_kallsyms(struct module *mod,
>  			 Elf_Shdr *sechdrs,
> +			 unsigned int shnum,
>  			 unsigned int symindex,
>  			 unsigned int strindex,
> +			 unsigned long symoffs,
>  			 const char *secstrings)
>  {
>  	unsigned int i;
> @@ -1857,12 +1914,26 @@ static void add_kallsyms(struct module *
>  	for (i = 0; i < mod->num_symtab; i++)
>  		mod->symtab[i].st_info
>  			= elf_type(&mod->symtab[i], sechdrs, secstrings, mod);
> +
> +	mod->core_symtab = mod->module_core + symoffs;
> +	mod->core_num_syms = filter_symbols(mod->core_symtab,
> +					    mod->symtab, mod->num_symtab,
> +					    sechdrs, shnum);

Hmm, could avoid symoffs if copy_core_symbols worked backwards.  Probably
not worthwhile tho.

>  	trim_init_extable(mod);
> +#ifdef CONFIG_KALLSYMS
> +	mod->num_symtab = mod->core_num_syms;
> +	mod->symtab = mod->core_symtab;
> +#endif
>  	module_free(mod, mod->module_init);
>  	mod->module_init = NULL;
>  	mod->init_size = 0;

core_num_syms/core_symtab is really a temporary; we should note that in
the module.h header next to those fields.

Thanks!
Rusty.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ