我们使用Linux系统调用,如fork()、pthread()、signal()等,在C或C++程序中进行编译,生成可执行文件(a.out)。现在,我怀疑文件a.out是否包含所使用的所有linux系统调用的目标代码,或者可执行文件是否只包含对系统函数的调用,以及系统调用函数是否在运行时被链接?假设我将我的a.out文件移到其他Linux操作系统上,它以不同的语法实现系统调用,并尝试编译它,它会工作吗?我怀疑系统调用函数定义是否是a.out文件的一部分?
发布于 2015-07-12 13:11:38
用户空间二进制文件不包含系统调用的实现。这意味着任何用户都可以将任何代码注入内核并接管系统。
相反,他们需要切换到内核模式,通过使用处理器中断或特殊指令。然后处理器可以从内核执行系统调用实现。
通常使用用户空间库(如libc ),它提供存根,将syscall的参数转换为适当的协议,并触发跳转到内核模式。它通常是动态链接的,因此这些存根也不会出现在可执行文件中。
https://stackoverflow.com/questions/31367477
复制相似问题