Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261982AbVDLHNh (ORCPT ); Tue, 12 Apr 2005 03:13:37 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S262040AbVDLHMD (ORCPT ); Tue, 12 Apr 2005 03:12:03 -0400 Received: from mail1.asahi-net.or.jp ([202.224.39.197]:16108 "EHLO mail.asahi-net.or.jp") by vger.kernel.org with ESMTP id S262041AbVDLHGK (ORCPT ); Tue, 12 Apr 2005 03:06:10 -0400 Date: Tue, 12 Apr 2005 16:06:02 +0900 Message-ID: From: Yoshinori Sato To: linux-kernel@vger.kernel.org Subject: [RFC] kallsyms C_SYMBOL_PREFIX support User-Agent: Wanderlust/2.11.30 (Wonderwall) SEMI/1.14.6 (Maruoka) LIMIT/1.14.9 (Domyoji) APEL/10.6 Emacs/21.4 (i386-pc-linux-gnu) MULE/5.0 (SAKAKI) MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4961 Lines: 181 kallsyms does not consider SYMBOL_PREFIX of C. Consequently do not work in architecture using prefix character (h8300, v850) really. Because I can want to use this, I made a patch. Please comment. -- Yoshinori Sato ===== scripts/kallsyms.c 1.16 vs edited ===== --- 1.16/scripts/kallsyms.c 2005-01-01 19:22:13 +09:00 +++ edited/scripts/kallsyms.c 2005-04-12 15:50:47 +09:00 @@ -69,6 +69,7 @@ static int size, cnt; static unsigned long long _stext, _etext, _sinittext, _einittext; static int all_symbols = 0; +static char symbol_prefix_char = '\0'; struct token { unsigned char data[MAX_TOK_SIZE]; @@ -93,7 +94,7 @@ static void usage(void) { - fprintf(stderr, "Usage: kallsyms [--all-symbols] < in.map > out.S\n"); + fprintf(stderr, "Usage: kallsyms [--all-symbols] [--symbol-prefix=] < in.map > out.S\n"); exit(1); } @@ -112,6 +113,7 @@ read_symbol(FILE *in, struct sym_entry *s) { char str[500]; + char *sym; int rc; rc = fscanf(in, "%llx %c %499s\n", &s->addr, &s->type, str); @@ -123,27 +125,32 @@ return -1; } + sym = str; + /* skip prefix char */ + if (symbol_prefix_char && str[0] == symbol_prefix_char) + sym++; + /* Ignore most absolute/undefined (?) symbols. */ - if (strcmp(str, "_stext") == 0) + if (strcmp(sym, "_stext") == 0) _stext = s->addr; - else if (strcmp(str, "_etext") == 0) + else if (strcmp(sym, "_etext") == 0) _etext = s->addr; - else if (strcmp(str, "_sinittext") == 0) + else if (strcmp(sym, "_sinittext") == 0) _sinittext = s->addr; - else if (strcmp(str, "_einittext") == 0) + else if (strcmp(sym, "_einittext") == 0) _einittext = s->addr; else if (toupper(s->type) == 'A') { /* Keep these useful absolute symbols */ - if (strcmp(str, "__kernel_syscall_via_break") && - strcmp(str, "__kernel_syscall_via_epc") && - strcmp(str, "__kernel_sigtramp") && - strcmp(str, "__gp")) + if (strcmp(sym, "__kernel_syscall_via_break") && + strcmp(sym, "__kernel_syscall_via_epc") && + strcmp(sym, "__kernel_sigtramp") && + strcmp(sym, "__gp")) return -1; } else if (toupper(s->type) == 'U' || - is_arm_mapping_symbol(str)) + is_arm_mapping_symbol(sym)) return -1; /* include the type field in the symbol name, so that it gets @@ -177,6 +184,11 @@ "_SDA2_BASE_", /* ppc */ NULL }; int i; + int offset = 1; + + /* skip prefix char */ + if (symbol_prefix_char && *(s->sym + 1) == symbol_prefix_char) + offset++; /* if --all-symbols is not specified, then symbols outside the text * and inittext sections are discarded */ @@ -190,17 +202,17 @@ * they may get dropped in pass 2, which breaks the kallsyms * rules. */ - if ((s->addr == _etext && strcmp(s->sym + 1, "_etext")) || - (s->addr == _einittext && strcmp(s->sym + 1, "_einittext"))) + if ((s->addr == _etext && strcmp(s->sym + offset, "_etext")) || + (s->addr == _einittext && strcmp(s->sym + offset, "_einittext"))) return 0; } /* Exclude symbols which vary between passes. */ - if (strstr(s->sym + 1, "_compiled.")) + if (strstr(s->sym + offset, "_compiled.")) return 0; for (i = 0; special_symbols[i]; i++) - if( strcmp(s->sym + 1, special_symbols[i]) == 0 ) + if( strcmp(s->sym + offset, special_symbols[i]) == 0 ) return 0; return 1; @@ -225,9 +237,15 @@ static void output_label(char *label) { - printf(".globl %s\n",label); + if (symbol_prefix_char) + printf(".globl %c%s\n", symbol_prefix_char, label); + else + printf(".globl %s\n", label); printf("\tALGN\n"); - printf("%s:\n",label); + if (symbol_prefix_char) + printf("%c%s:\n", symbol_prefix_char, label); + else + printf("%s:\n", label); } /* uncompress a compressed symbol. When this function is called, the best table @@ -665,6 +683,13 @@ insert_real_symbols_in_table(); + /* When valid symbol is not registered, exit to error */ + if (good_head.left == good_head.right && + bad_head.left == bad_head.right) { + fprintf(stderr, "No valid symbol.\n"); + exit(1); + } + optimize_result(); } @@ -672,9 +697,21 @@ int main(int argc, char **argv) { - if (argc == 2 && strcmp(argv[1], "--all-symbols") == 0) - all_symbols = 1; - else if (argc != 1) + if (argc >= 2) { + int i; + for (i = 1; i < argc; i++) { + if(strcmp(argv[i], "--all-symbols") == 0) + all_symbols = 1; + else if (strncmp(argv[i], "--symbol-prefix=", 16) == 0) { + char *p = &argv[i][16]; + /* skip quote */ + if ((*p == '"' && *(p+2) == '"') || (*p == '\'' && *(p+2) == '\'')) + p++; + symbol_prefix_char = *p; + } else + usage(); + } + } else if (argc != 1) usage(); read_map(stdin); @@ -683,4 +720,3 @@ return 0; } - - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/