diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/kallsyms.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index fe11df83d1fc..d3d2e5341051 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c | |||
| @@ -67,7 +67,7 @@ struct sym_entry { | |||
| 67 | 67 | ||
| 68 | static struct sym_entry *table; | 68 | static struct sym_entry *table; |
| 69 | static int size, cnt; | 69 | static int size, cnt; |
| 70 | static unsigned long long _stext, _etext, _sinittext, _einittext; | 70 | static unsigned long long _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext; |
| 71 | static int all_symbols = 0; | 71 | static int all_symbols = 0; |
| 72 | static char symbol_prefix_char = '\0'; | 72 | static char symbol_prefix_char = '\0'; |
| 73 | 73 | ||
| @@ -139,6 +139,10 @@ read_symbol(FILE *in, struct sym_entry *s) | |||
| 139 | _sinittext = s->addr; | 139 | _sinittext = s->addr; |
| 140 | else if (strcmp(sym, "_einittext") == 0) | 140 | else if (strcmp(sym, "_einittext") == 0) |
| 141 | _einittext = s->addr; | 141 | _einittext = s->addr; |
| 142 | else if (strcmp(sym, "_sextratext") == 0) | ||
| 143 | _sextratext = s->addr; | ||
| 144 | else if (strcmp(sym, "_eextratext") == 0) | ||
| 145 | _eextratext = s->addr; | ||
| 142 | else if (toupper(s->type) == 'A') | 146 | else if (toupper(s->type) == 'A') |
| 143 | { | 147 | { |
| 144 | /* Keep these useful absolute symbols */ | 148 | /* Keep these useful absolute symbols */ |
| @@ -194,16 +198,18 @@ symbol_valid(struct sym_entry *s) | |||
| 194 | * and inittext sections are discarded */ | 198 | * and inittext sections are discarded */ |
| 195 | if (!all_symbols) { | 199 | if (!all_symbols) { |
| 196 | if ((s->addr < _stext || s->addr > _etext) | 200 | if ((s->addr < _stext || s->addr > _etext) |
| 197 | && (s->addr < _sinittext || s->addr > _einittext)) | 201 | && (s->addr < _sinittext || s->addr > _einittext) |
| 202 | && (s->addr < _sextratext || s->addr > _eextratext)) | ||
| 198 | return 0; | 203 | return 0; |
| 199 | /* Corner case. Discard any symbols with the same value as | 204 | /* Corner case. Discard any symbols with the same value as |
| 200 | * _etext or _einittext, they can move between pass 1 and 2 | 205 | * _etext _einittext or _eextratext; they can move between pass |
| 201 | * when the kallsyms data is added. If these symbols move then | 206 | * 1 and 2 when the kallsyms data are added. If these symbols |
| 202 | * they may get dropped in pass 2, which breaks the kallsyms | 207 | * move then they may get dropped in pass 2, which breaks the |
| 203 | * rules. | 208 | * kallsyms rules. |
| 204 | */ | 209 | */ |
| 205 | if ((s->addr == _etext && strcmp(s->sym + offset, "_etext")) || | 210 | if ((s->addr == _etext && strcmp(s->sym + offset, "_etext")) || |
| 206 | (s->addr == _einittext && strcmp(s->sym + offset, "_einittext"))) | 211 | (s->addr == _einittext && strcmp(s->sym + offset, "_einittext")) || |
| 212 | (s->addr == _eextratext && strcmp(s->sym + offset, "_eextratext"))) | ||
| 207 | return 0; | 213 | return 0; |
| 208 | } | 214 | } |
| 209 | 215 | ||
