gpt4 book ai didi

c - printf@plt 和 puts@plt 的区别

转载 作者:太空狗 更新时间:2023-10-29 15:12:14 27 4
gpt4 key购买 nike

我一直在通过反汇编一些 C 代码来学习汇编语言。当我用 GDB 反汇编这个基本的 C 代码时:

#include <stdio.h>
void main(void) {
printf("Hello World\n");
}

在汇编代码中,它给出了这一行:

0x08048424 <+25>:   call   0x80482e0 <puts@plt>

但是,当我反汇编以下在 printf 函数中有一个整数的代码时:

#include <stdio.h>
void main(void) {
int a = 1;
printf("Hello Word %d\n", a);
}

它给出了这一行:

0x0804842e <+35>:   call   0x80482e0 <printf@plt>

printf@plt 和 puts@plt 有什么区别?

为什么反汇编程序无法识别没有整型参数的 printf 函数?

最佳答案

在 GCC 中,printfputs 是内置函数。这意味着编译器完全了解它们的语义。在这种情况下,编译器可以自由地将对一个函数的调用替换为对另一个函数的等效调用,如果它认为它会产生更好(更快和/或更紧凑)的代码。

puts 通常是更高效的函数,因为它不必解析和解释格式字符串。

这正是您的情况。您对 printf 的第一次调用实际上并不需要任何 printf 特定的功能。您提供给 printf 的格式字符串很简单:其中没有转换说明符。编译器认为您对 printf 的第一次调用与对 puts 的等效调用更好。

与此同时,您对 printf 的第二次调用对 printf 格式字符串进行了非平凡的使用,即它依赖于 printf 特定的功能。

(从 2005 年开始对这个具体问题进行了一些相当深入的研究:http://www.ciselant.de/projects/gcc_printf/gcc_printf.html)

关于c - printf@plt 和 puts@plt 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007002/

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