Browse Source

use demangled names (#375)

there is no change for c symbols
  rust symbols name will be more readable
zhaoyao73 1 year ago
parent
commit
9029414af2
2 changed files with 21 additions and 15 deletions
  1. 2 2
      kernel/src/debug/Makefile
  2. 19 13
      kernel/src/debug/kallsyms.c

+ 2 - 2
kernel/src/debug/Makefile

@@ -5,7 +5,7 @@ CFLAGS += -I .
 
 # 请注意,这个不能使用raw的gcc来编译。
 kallsyms.o: kallsyms.c
-	gcc -o kallsyms kallsyms.c 
+	gcc -o kallsyms kallsyms.c
 	rm -rf kallsyms.o
 
 traceback.o: traceback/traceback.c
@@ -16,7 +16,7 @@ traceback.o: traceback/traceback.c
 generate_kallsyms: kallsyms.o 
 	echo "Generating kallsyms..."
 # 请注意,这个不能使用raw的nm来处理
-	nm -n $(kernel_root_path)/kernel | ./kallsyms > kallsyms.S
+	nm -n -C $(kernel_root_path)/kernel | ./kallsyms > kallsyms.S
 	$(CC) -c kallsyms.S -o kallsyms.o
 	@echo "Kallsyms generated."
 

+ 19 - 13
kernel/src/debug/kallsyms.c

@@ -51,22 +51,26 @@ int read_symbol(FILE *filp, struct kernel_symbol_entry_t *entry)
 {
     // 本函数假设nm命令输出的结果中,每行最大512字节
     char str[512] = {0};
-    int retval = fscanf(filp, "%llx %c %510s\n", &entry->vaddr, &entry->type, str);
+    char* s = fgets(str, sizeof(str), filp);
+    if (s != str) {
+        return -1;
+    }
 
-    // 如果当前行不符合要求
-    if (retval != 3)
-    {
-        if (retval != EOF)
-        {
-            // 如果不是输入流的结尾,说明该行不符合要求,将其过滤
-            fgets(str, 512, filp);
-        }
+    char symbol_name[512] = {0};
+    int retval = sscanf(str, "%llx %c %512c", &entry->vaddr, &entry->type, symbol_name);
 
+    // 如果当前行不符合要求
+    if (retval != 3) {
         return -1;
     }
     // malloc一块内存,然后把str的内容拷贝进去,接着修改symbol指针
-    entry->symbol = strdup(str);
-    entry->symbol_length = strlen(str) + 1; // +1的原因是.asciz指令会在字符串末尾自动添加结束符\0
+    size_t len = strlen(symbol_name);
+    if (len >= 1 && symbol_name[len - 1] == '\n') {
+        symbol_name[len - 1] = '\0';
+        len--;
+    }
+    entry->symbol = strdup(symbol_name);
+    entry->symbol_length = len + 1; // +1的原因是.asciz指令会在字符串末尾自动添加结束符\0
     return 0;
 }
 
@@ -96,10 +100,12 @@ void read_map(FILE *filp)
     // 查找符号表中的text和etext标签
     for (uint64_t i = 0; i < entry_count; ++i)
     {
-        if (strcmp(symbol_table[i].symbol, "_text")==0)
+        if (text_vaddr == 0ULL && strcmp(symbol_table[i].symbol, "_text") == 0)
             text_vaddr = symbol_table[i].vaddr;
-        if (strcmp(symbol_table[i].symbol, "_etext")==0)
+        if (etext_vaddr == 0ULL && strcmp(symbol_table[i].symbol, "_etext") == 0)
             etext_vaddr = symbol_table[i].vaddr;
+        if (text_vaddr != 0ULL && etext_vaddr != 0ULL)
+            break;
     }
 }