gpt4 book ai didi

c - ltrace printf() 但显示 puts()

转载 作者:太空狗 更新时间:2023-10-29 16:06:00 26 4
gpt4 key购买 nike

根据我的理解,ltrace 实用程序用于跟踪库调用。我ltrace了一个只调用printf的简单程序,但是库函数显示的是puts而不是printf。我很好奇为什么它不显示 printf 而显示 puts

最佳答案

ltrace 显示 puts 被调用,因为它在二进制文件上工作并且二进制文件调用 puts

Example : 来源:

#include <stdio.h>

int main(int c, char *v[])
{
printf("hello world\n");
}

程序集:

.LC0:
.string "hello world"
main:
subq $8, %rsp
movl $.LC0, %edi
call puts
xorl %eax, %eax
addq $8, %rsp
ret

如果您尝试更多示例,您可能会发现编译器生成的汇编代码调用了 memcpy 而源代码没有,而汇编代码没有调用 memcpy (或许多其他常用功能之一)源代码何时执行,等等。编译器只需要尊重程序的含义,不需要尊重被调用的实际函数。由于 printfputs 是不允许重新定义的标准函数,因此它知道这些函数的作用,如果它认为有用,可以用另一个替换。

在这里,puts 被替换为 printf 因为 puts 更简单(它不解释 % 格式并且它不是可变的),因此更快。在这种情况下,允许编译器将 printf 替换为 puts,因为打印字符串不需要任何格式说明符的解释,并且字符串恰好以 结尾\n.

关于c - ltrace printf() 但显示 puts(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38265436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com