【发布时间】:2015-03-03 05:03:36
【问题描述】:
所以我从一个文件中获取 ELF 函数符号,将它们放入一个新的符号结构中,并按名称的字母顺序对符号数组进行排序。我使用 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;
我知道平方很奇怪,但它可以解决这个问题!这很难,因为它是一个大项目,我想包括上下文,但不要压倒一切。
【问题讨论】:
-
我认为您需要发布更完整的代码以供任何人帮助您。
-
您的要求并不完全清楚。是排序功能不工作,还是
printAllSymbols方法工作不正常?另外,您没有包含该内容,您应该将其添加到您的帖子中。 -
qsort 的第三个参数是每个元素的大小,所以我认为应该只是 sizeof(Symbol);为什么要平方?
标签: c struct elf qsort sortcomparefunction