diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-06 01:10:07 +0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-06 01:10:07 +0400 | 
| commit | da9e82b3b8989fc09e2a4c45b9da604ba2b4c46d (patch) | |
| tree | 7355d2afe95be27fddb8fa4baa46476c76aeb8ee /scripts/mod/modpost.h | |
| parent | 90d3417a3a4e810d67081dd106f0e603a856978f (diff) | |
| parent | 772320e84588dcbe1600ffb83e5f328f2209ac2a (diff) | |
| download | linux-da9e82b3b8989fc09e2a4c45b9da604ba2b4c46d.tar.xz | |
Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6
* 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6:
  modpost: support objects with more than 64k sections
  trivial: fix a typo in a filename
  frv: clean up arch/frv/Makefile
  kbuild: allow assignment to {A,C}FLAGS_KERNEL on the command line
  kbuild: allow assignment to {A,C,LD}FLAGS_MODULE on the command line
  Kbuild: Add option to set -femit-struct-debug-baseonly
  Makefile: "make kernelrelease" should show the correct full kernel version
  Makefile.build: make KBUILD_SYMTYPES work again
Diffstat (limited to 'scripts/mod/modpost.h')
| -rw-r--r-- | scripts/mod/modpost.h | 43 | 
1 files changed, 43 insertions, 0 deletions
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index be987a44f250..0388cfccac8d 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -129,8 +129,51 @@ struct elf_info {  	const char   *strtab;  	char	     *modinfo;  	unsigned int modinfo_len; + +	/* support for 32bit section numbers */ + +	unsigned int num_sections; /* max_secindex + 1 */ +	unsigned int secindex_strings; +	/* if Nth symbol table entry has .st_shndx = SHN_XINDEX, +	 * take shndx from symtab_shndx_start[N] instead */ +	Elf32_Word   *symtab_shndx_start; +	Elf32_Word   *symtab_shndx_stop;  }; +static inline int is_shndx_special(unsigned int i) +{ +	return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE; +} + +/* shndx is in [0..SHN_LORESERVE) U (SHN_HIRESERVE, 0xfffffff], thus: + * shndx == 0               <=> sechdrs[0] + * ...... + * shndx == SHN_LORESERVE-1 <=> sechdrs[SHN_LORESERVE-1] + * shndx == SHN_HIRESERVE+1 <=> sechdrs[SHN_LORESERVE] + * shndx == SHN_HIRESERVE+2 <=> sechdrs[SHN_LORESERVE+1] + * ...... + * fyi: sym->st_shndx is uint16, SHN_LORESERVE = ff00, SHN_HIRESERVE = ffff, + * so basically we map  0000..feff -> 0000..feff + *                      ff00..ffff -> (you are a bad boy, dont do it) + *                     10000..xxxx -> ff00..(xxxx-0x100) + */ +static inline unsigned int shndx2secindex(unsigned int i) +{ +	if (i <= SHN_HIRESERVE) +		return i; +	return i - (SHN_HIRESERVE + 1 - SHN_LORESERVE); +} + +/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */ +static inline unsigned int get_secindex(const struct elf_info *info, +					const Elf_Sym *sym) +{ +	if (sym->st_shndx != SHN_XINDEX) +		return sym->st_shndx; +	return shndx2secindex(info->symtab_shndx_start[sym - +						       info->symtab_start]); +} +  /* file2alias.c */  extern unsigned int cross_build;  void handle_moddevtable(struct module *mod, struct elf_info *info,  | 
