C 什么是';段类型:外部和#x27;艾达是什么意思?

C 什么是';段类型:外部和#x27;艾达是什么意思?,c,linker,loader,elf,ida,C,Linker,Loader,Elf,Ida,我试图使用IDA pro分析一个动态链接的64位ELF文件,发现一个带有externtpye的段,它位于.bss之后,如下所示 extern:00000000006021C0 ; Segment type: Externs extern:00000000006021C0 ; extern extern:00000000006021C0 ; void free(void *ptr) extern:00000000006021C0 extrn free:near ; DATA

我试图使用IDA pro分析一个动态链接的64位ELF文件,发现一个带有
extern
tpye的段,它位于
.bss
之后,如下所示

extern:00000000006021C0 ; Segment type: Externs
extern:00000000006021C0 ; extern
extern:00000000006021C0 ; void free(void *ptr)
extern:00000000006021C0        extrn free:near      ; DATA XREF: .got.plt:off_602018o
然而,当我在运行时使用gdb调试它时,我发现这个“extern”段只包含零!此段中没有除零以外的任何有效数据。此外,没有关于此段权限的描述,看起来此段甚至不存在

由于GOT中存在数据外部参照,可能与导入函数有关?但我找不到相关的文件,我想知道艾达是如何认识它的,它到底是什么


谢谢

extern
不是真正的段。它是由IDA创建的伪段,用于表示其他模块中具有未知地址的符号;GET通常包含指向这些的指针。在调试过程中,它可能会被.bss或OS加载器清除的堆栈区域覆盖,这就是为什么会在那里看到零。

IDA上下文中的extern与C/C++上下文中的extern有点不同

在C/C++中,
extern
关键字用于声明变量/函数/对象,该变量/函数/对象未在当前对象中实际定义,但在链接二进制文件时可用。例如,这适用于在一个.c文件中定义数组并在多个文件中访问它的情况

在IDA的上下文中,externs部分用于描述从.so/.dll文件定义API的内存区域。这通常是PE中的IAT和ELF文件中的GOT。当externs部分中的对象具有已知API的名称时,IDA将自动将其涂成粉红色,并添加原型(如果可用)