.data
ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_call) /* 0 */
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
...
.long SYMBOL_NAME(sys_vfork) /* 190 */
我读了这个源代码。我在源代码中找不到.data
或.long
定义。
答案 0 :(得分:3)
它们是assembler directives - 汇编程序的特殊指示,指示它执行不同的操作,而不是将处理器指令插入已编译的机器代码中。
.data
directive告诉汇编器将以下指令发送到可执行文件的data
部分的一个子部分的末尾。通常,机器代码被发送到可执行文件的所谓text
部分,而诸如全局变量之类的非可执行数据存储在所谓的data
部分之一中。不同的部分在运行时具有不同的内存权限,以及其他功能。
.long
指令等同于.int
directive,它只是将一个文字数值插入到机器代码中。因此.long SYMBOL_NAME(sys_ni_call)
会插入sys_ni_call
符号位置的数值。
因此,将.data
指令后跟.long
指令放在一起会导致汇编程序将特定的整数值放入生成的目标代码的data
部分之一。这些值将是不可执行的,它们可能是只读的或读写的,具体取决于sys_call_table
部分的data
子部分的权限配置。