Patch by the PaX team to get rid of executable stacks. --- modutils/insmod/insmod.c +++ modutils/insmod/insmod.c @@ -366,18 +366,21 @@ static void hide_special_symbols(struct sym->info = ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info)); } +static struct obj_file *load_map_file; + +static int load_map_cmp(const void *a, const void *b) { + struct obj_symbol **as = (struct obj_symbol **) a; + struct obj_symbol **bs = (struct obj_symbol **) b; + unsigned long aa = obj_symbol_final_value(load_map_file, *as); + unsigned long ba = obj_symbol_final_value(load_map_file, *bs); + return aa < ba ? -1 : aa > ba ? 1 : 0; +} + static void print_load_map(struct obj_file *f) { struct obj_symbol *sym; struct obj_symbol **all, **p; struct obj_section *sec; - int load_map_cmp(const void *a, const void *b) { - struct obj_symbol **as = (struct obj_symbol **) a; - struct obj_symbol **bs = (struct obj_symbol **) b; - unsigned long aa = obj_symbol_final_value(f, *as); - unsigned long ba = obj_symbol_final_value(f, *bs); - return aa < ba ? -1 : aa > ba ? 1 : 0; - } int i, nsyms, *loaded; /* Report on the section layout. */ @@ -425,7 +428,9 @@ static void print_load_map(struct obj_fi *p++ = sym; /* Sort them by final value. */ + load_map_file = f; qsort(all, nsyms, sizeof(struct obj_file *), load_map_cmp); + load_map_file = NULL; /* And list them. */ lprintf("\nSymbols:");