summaryrefslogtreecommitdiff
blob: 7af4599c71541acc3f6117798fb47328e40816e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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:");