【发布时间】:2018-04-04 19:37:06
【问题描述】:
我写了一个简单的C 程序,它只调用exit() 函数,但是strace 说二进制实际上是在调用exit_group,exit() 是exit_group() 包装器吗?这两个功能是等价的吗?如果是这样,为什么编译器会选择 exit_group() 而不是 exit()?
【问题讨论】:
-
所以你在
eax中加载1并调用内核中断,strace显示exit_group调用(2520xfc)?哪个编译器?你的编译和链接字符串是什么? (也可能是strace问题,尽管您会认为他们有正确的查找表) -
@DavidC.Rankin 据我正确理解这个问题,用户正在调用
libc库中的exit()函数。 -
IIRC,来自标准 C(和/或 POSIX?)成为线程感知,并要求
exit()应该终止所有正在运行的线程;在 Linux 上,普通的exitsyscall 只会终止当前线程,因此在某些时候,exit()libc 函数被重新映射到exit_groupsyscall,这符合标准的要求。 -
@MartinRosenau,你可能是对的,
assembly标签让我失望了。 (因为程序集确实有exit和exit_group系统调用。 -
我只是做了一个简短的C文件并使用
gcc转储到汇编程序(例如gcc -S -masm=intel -o exitcall.asm exitcall.c和汇编程序指令是call exit@PLT,运行trace通过,你是对的,我发现exit_group(0)。然后我在程序集中编写文件nasm并在可执行文件上运行strace,它调用exit(0) = ?; +++ exited with 0 +++奇怪,我没有答案,但我现在完全理解了这个问题。你在使用@ 987654347@作为编译器?
标签: c gcc assembly x86 system-calls