c - 'names' 字符串在使用 'Symbol' 结构进行 qsort 后消失

标签 c struct elf qsort sortcomparefunction

因此,我从文件中获取 ELF 函数符号,将它们放入新的 Symbol 结构中,并按名称字母顺序对符号数组进行排序。我使用 strdup 为我的字符串分配内存

qsort 之前:

00000000 00000015 t crash_here
00000015 00000014 t winky
00000036 0000002e t dinky
00000029 0000000d T pinky
00000064 00000014 T binky
00000078 00000017 T main

qsort之后:

00000064 00000014 T 
00000000 00000015 t 
00000036 0000002e t 
00000078 00000017 T 
00000029 0000000d T 
00000015 00000014 t 

可能出了什么问题?! 以下是更多上下文代码:

FILE *fp;
fp = fopen(argv[1], "r");
if(!fp) error(1, 0, "'%s': no such file", argv[1]); //check for valid file
size_t nelems = 0; 
Symbol *symbs = (Symbol *)getFunctionSymbols(fp, &nelems);
printAllSymbols(symbs, nelems);
qsort(symbs , nelems, sizeof(Symbol)* sizeof(Symbol), compareSymbAlph);
printAllSymbols(symbs, nelems);

int compareSymbAlph(const void *a, const void *b){
 Symbol *first = (Symbol *)a;
 Symbol *second = (Symbol *)b; 
 return strcmp(first->name, second->name);
}

编辑

qsort 函数正在运行并按字母顺序对它们进行排序,但不知何故,“名称”在这个过程中丢失了。

void printSymbol(Symbol *s){
    printf("%08x %08x %c %s\n", s->addr, s->size, s->binding, s->name);
}

void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i* sizeof(Symbol); 
        printSymbol(curr); 
    }
}

typedef struct {
    char          *name;            // name of symbol 
    uintptr_t      addr;            // symbol address
    unsigned int   size;            // symbol size in bytes
    unsigned char  binding;         // binding- T for extern or t for static
} Symbol;

我知道平方很奇怪,但它正在解决这个问题!这很困难,因为这是一个大项目,我想包含背景信息,但又不想让人不知所措。

最佳答案

更改qsort的调用

qsort(symbs , nelems, sizeof(Symbol)* sizeof(Symbol), compareSymbAlph);

如下方式

qsort(symbs , nelems, sizeof(Symbol), compareSymbAlph);

函数 printAllSymbols 也是错误的

void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i* sizeof(Symbol); 
        printSymbol(curr); 
    }
}

在此声明中

Symbol *curr = symbArray + i* sizeof(Symbol); 

使用了无效的指针算术。

简单地重写它

void printAllSymbols(Symbol *symbArray, size_t nelems){
    for(size_t i = 0; i < nelems; i++){
        Symbol *curr = symbArray + i; 
        printSymbol(curr); 
    }
}

关于c - 'names' 字符串在使用 'Symbol' 结构进行 qsort 后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824468/

相关文章:

pointers - 在映射中的结构上调用指针方法

c - 从elf获取动态符号表信息

c - va_list 参数实际上不是 va_list

C语言,对数组中的元素进行分组

c - 从函数返回数组/指针

Python 使用 struct 将定界文本文件固定为 csv

c - 在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵

c - 结构会自动分解到内存位置吗?

c++ - 是否可以从 ELF Core 文件中删除堆?

c - 如何将可执行入口点的名称从 main 更改为其他名称?