X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fkallsyms.c;h=f4b328979cd16b12bc8e81e54850b4ba7afe2edd;hb=918425d07b2fe2087ee7dabf90e69a17e914649c;hp=43c110fe782914cd6613a915d7a72c3f31aa620b;hpb=86090fcac5e27b630656fe3d963a6b80e26dac44;p=linux-2.6.git diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 43c110fe7..f4b328979 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -5,12 +5,13 @@ * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * - * Usage: nm -n vmlinux | scripts/kallsyms > symbols.S + * Usage: nm -n vmlinux | scripts/kallsyms [--all-symbols] > symbols.S */ #include #include #include +#include struct sym_entry { unsigned long long addr; @@ -22,11 +23,12 @@ struct sym_entry { static struct sym_entry *table; static int size, cnt; static unsigned long long _stext, _etext, _sinittext, _einittext; +static int all_symbols = 0; static void usage(void) { - fprintf(stderr, "Usage: kallsyms < in.map > out.S\n"); + fprintf(stderr, "Usage: kallsyms [--all-symbols] < in.map > out.S\n"); exit(1); } @@ -44,6 +46,19 @@ read_symbol(FILE *in, struct sym_entry *s) } return -1; } + + /* Ignore most absolute/undefined (?) symbols. */ + if (strcmp(str, "_stext") == 0) + _stext = s->addr; + else if (strcmp(str, "_etext") == 0) + _etext = s->addr; + else if (strcmp(str, "_sinittext") == 0) + _sinittext = s->addr; + else if (strcmp(str, "_einittext") == 0) + _einittext = s->addr; + else if (toupper(s->type) == 'A' || toupper(s->type) == 'U') + return -1; + s->sym = strdup(str); return 0; } @@ -51,9 +66,11 @@ read_symbol(FILE *in, struct sym_entry *s) static int symbol_valid(struct sym_entry *s) { - if ((s->addr < _stext || s->addr > _etext) - && (s->addr < _sinittext || s->addr > _einittext)) - return 0; + if (!all_symbols) { + if ((s->addr < _stext || s->addr > _etext) + && (s->addr < _sinittext || s->addr > _einittext)) + return 0; + } if (strstr(s->sym, "_compiled.")) return 0; @@ -64,8 +81,6 @@ symbol_valid(struct sym_entry *s) static void read_map(FILE *in) { - int i; - while (!feof(in)) { if (cnt >= size) { size += 10000; @@ -78,22 +93,11 @@ read_map(FILE *in) if (read_symbol(in, &table[cnt]) == 0) cnt++; } - for (i = 0; i < cnt; i++) { - if (strcmp(table[i].sym, "_stext") == 0) - _stext = table[i].addr; - if (strcmp(table[i].sym, "_etext") == 0) - _etext = table[i].addr; - if (strcmp(table[i].sym, "_sinittext") == 0) - _sinittext = table[i].addr; - if (strcmp(table[i].sym, "_einittext") == 0) - _einittext = table[i].addr; - } } static void write_src(void) { - unsigned long long last_addr; int i, valid = 0; char *prev; @@ -111,16 +115,12 @@ write_src(void) printf(".globl kallsyms_addresses\n"); printf("\tALGN\n"); printf("kallsyms_addresses:\n"); - for (i = 0, last_addr = 0; i < cnt; i++) { + for (i = 0; i < cnt; i++) { if (!symbol_valid(&table[i])) continue; - - if (table[i].addr == last_addr) - continue; printf("\tPTR\t%#llx\n", table[i].addr); valid++; - last_addr = table[i].addr; } printf("\n"); @@ -134,20 +134,16 @@ write_src(void) printf("\tALGN\n"); printf("kallsyms_names:\n"); prev = ""; - for (i = 0, last_addr = 0; i < cnt; i++) { + for (i = 0; i < cnt; i++) { int k; if (!symbol_valid(&table[i])) continue; - - if (table[i].addr == last_addr) - continue; for (k = 0; table[i].sym[k] && table[i].sym[k] == prev[k]; ++k) ; printf("\t.byte 0x%02x\n\t.asciz\t\"%s\"\n", k, table[i].sym + k); - last_addr = table[i].addr; prev = table[i].sym; } printf("\n"); @@ -156,7 +152,9 @@ write_src(void) int main(int argc, char **argv) { - if (argc != 1) + if (argc == 2 && strcmp(argv[1], "--all-symbols") == 0) + all_symbols = 1; + else if (argc != 1) usage(); read_map(stdin);