mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-12 18:26:50 +00:00
use demangled names (#375)
there is no change for c symbols rust symbols name will be more readable
This commit is contained in:
parent
22c9db312a
commit
9029414af2
@ -5,7 +5,7 @@ CFLAGS += -I .
|
|||||||
|
|
||||||
# 请注意,这个不能使用raw的gcc来编译。
|
# 请注意,这个不能使用raw的gcc来编译。
|
||||||
kallsyms.o: kallsyms.c
|
kallsyms.o: kallsyms.c
|
||||||
gcc -o kallsyms kallsyms.c
|
gcc -o kallsyms kallsyms.c
|
||||||
rm -rf kallsyms.o
|
rm -rf kallsyms.o
|
||||||
|
|
||||||
traceback.o: traceback/traceback.c
|
traceback.o: traceback/traceback.c
|
||||||
@ -16,7 +16,7 @@ traceback.o: traceback/traceback.c
|
|||||||
generate_kallsyms: kallsyms.o
|
generate_kallsyms: kallsyms.o
|
||||||
echo "Generating kallsyms..."
|
echo "Generating kallsyms..."
|
||||||
# 请注意,这个不能使用raw的nm来处理
|
# 请注意,这个不能使用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
|
$(CC) -c kallsyms.S -o kallsyms.o
|
||||||
@echo "Kallsyms generated."
|
@echo "Kallsyms generated."
|
||||||
|
|
||||||
|
@ -51,22 +51,26 @@ int read_symbol(FILE *filp, struct kernel_symbol_entry_t *entry)
|
|||||||
{
|
{
|
||||||
// 本函数假设nm命令输出的结果中,每行最大512字节
|
// 本函数假设nm命令输出的结果中,每行最大512字节
|
||||||
char str[512] = {0};
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
char symbol_name[512] = {0};
|
||||||
|
int retval = sscanf(str, "%llx %c %512c", &entry->vaddr, &entry->type, symbol_name);
|
||||||
|
|
||||||
// 如果当前行不符合要求
|
// 如果当前行不符合要求
|
||||||
if (retval != 3)
|
if (retval != 3) {
|
||||||
{
|
|
||||||
if (retval != EOF)
|
|
||||||
{
|
|
||||||
// 如果不是输入流的结尾,说明该行不符合要求,将其过滤
|
|
||||||
fgets(str, 512, filp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
// malloc一块内存,然后把str的内容拷贝进去,接着修改symbol指针
|
// malloc一块内存,然后把str的内容拷贝进去,接着修改symbol指针
|
||||||
entry->symbol = strdup(str);
|
size_t len = strlen(symbol_name);
|
||||||
entry->symbol_length = strlen(str) + 1; // +1的原因是.asciz指令会在字符串末尾自动添加结束符\0
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,10 +100,12 @@ void read_map(FILE *filp)
|
|||||||
// 查找符号表中的text和etext标签
|
// 查找符号表中的text和etext标签
|
||||||
for (uint64_t i = 0; i < entry_count; ++i)
|
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;
|
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;
|
etext_vaddr = symbol_table[i].vaddr;
|
||||||
|
if (text_vaddr != 0ULL && etext_vaddr != 0ULL)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user