C语言readelf看到的符号表中bind为GLOBAL,vis为HIDDEN的函数是否对外可见
时间: 2023-09-10 13:04:55 浏览: 92
### 回答1:
根据C语言的编译规则,全局变量和函数都会被编译成ELF文件中的"GLOBAL"符号,而被标记为"static"或者"inline"的变量或函数则会被标记为"HIDDEN"符号。因此,readelf命令中显示的bind字段为GLOBAL的符号对外可见,而bind字段为HIDDEN的符号则对外不可见。所以,被标记为HIDDEN的函数在外部是不可见的,不能被其他的目标文件或库所引用。
### 回答2:
C语言中的readelf是一个用于查看ELF文件的工具,它可以解析ELF文件的不同部分,其中之一就是符号表。
符号表记录了函数、变量以及其他类型的符号在ELF文件中的相关信息,包括名称、地址、大小、绑定(bind)和可见性(vis)等属性。
如果readelf在符号表中显示bind为GLOBAL,vis为HIDDEN的函数,那么该函数对外是可见的。
bind属性指示符号的绑定类型,GLOBAL表示全局绑定,意味着该符号可以被其他模块或文件引用。因此,当bind为GLOBAL时,表示该函数可以被外部模块或文件访问和调用。
vis属性指示符号的可见性,HIDDEN表示该符号对外是隐藏的,即不可见的。但需要注意的是,HIDDEN仅在ELF文件内起作用,对外部的ELF文件或模块不起作用。
因此,当bind为GLOBAL,vis为HIDDEN时,该函数在ELF文件内部可以被其他函数或模块访问和调用,但对于外部的ELF文件或模块而言,该函数是不可见的,不能引用。
总结起来,C语言readelf看到的符号表中bind为GLOBAL,vis为HIDDEN的函数对外是不可见的。
### 回答3:
C语言readelf看到的符号表中,bind为GLOBAL,vis为HIDDEN的函数对外可见。
在C语言中,符号表用于存储函数和变量等标识符的信息。其中,bind字段用于指示其可见范围,vis字段用于指示其外部可见性。
对于bind字段为GLOBAL的函数,表示其全局可见,即可以被其他源文件中的函数和变量所引用和调用,因此对外可见。
而vis字段为HIDDEN的函数,虽然其bind字段为GLOBAL,表示其全局可见,但vis字段为HIDDEN表示其外部不可见,即只能在当前编译单元(源文件)中被引用或调用,对外不可见。其他源文件无法使用该隐藏的函数,无法通过函数名进行调用。
因此,尽管bind字段为GLOBAL,但vis字段为HIDDEN的函数对外不可见。这意味着其他源文件无法直接使用该函数,而只能在当前源文件中使用。此类函数主要用于在当前源文件中共享和使用,而不会被外部其他代码访问。