diff options
Diffstat (limited to 'kernel/module.c')
| -rw-r--r-- | kernel/module.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/kernel/module.c b/kernel/module.c index d3d254571bd..4299aefc20b 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -1578,11 +1578,21 @@ static int simplify_symbols(Elf_Shdr *sechdrs,  	return ret;  } +/* Additional bytes needed by arch in front of individual sections */ +unsigned int __weak arch_mod_section_prepend(struct module *mod, +					     unsigned int section) +{ +	/* default implementation just returns zero */ +	return 0; +} +  /* Update size with this section: return offset. */ -static long get_offset(unsigned int *size, Elf_Shdr *sechdr) +static long get_offset(struct module *mod, unsigned int *size, +		       Elf_Shdr *sechdr, unsigned int section)  {  	long ret; +	*size += arch_mod_section_prepend(mod, section);  	ret = ALIGN(*size, sechdr->sh_addralign ?: 1);  	*size = ret + sechdr->sh_size;  	return ret; @@ -1622,7 +1632,7 @@ static void layout_sections(struct module *mod,  			    || strncmp(secstrings + s->sh_name,  				       ".init", 5) == 0)  				continue; -			s->sh_entsize = get_offset(&mod->core_size, s); +			s->sh_entsize = get_offset(mod, &mod->core_size, s, i);  			DEBUGP("\t%s\n", secstrings + s->sh_name);  		}  		if (m == 0) @@ -1640,7 +1650,7 @@ static void layout_sections(struct module *mod,  			    || strncmp(secstrings + s->sh_name,  				       ".init", 5) != 0)  				continue; -			s->sh_entsize = (get_offset(&mod->init_size, s) +			s->sh_entsize = (get_offset(mod, &mod->init_size, s, i)  					 | INIT_OFFSET_MASK);  			DEBUGP("\t%s\n", secstrings + s->sh_name);  		}  |