[英]ltrace printf() but shows puts()
根據我的理解,ltrace實用程序用於跟蹤庫調用。 我跟蹤一個只調用printf
的簡單程序,但庫函數顯示的是puts
而不是printf
。 我很好奇為什么它不顯示printf
而是puts
?
ltrace
顯示調用puts
因為它在二進制文件上工作而二進制文件調用puts
。
示例 :source:
#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
(或許多其他常用函數之一),等等上。 編譯器只需要尊重程序的含義,它不需要尊重被調用的實際函數。 由於printf
和puts
是不允許重新定義的標准函數,因此它知道這些函數的功能,並且如果認為它有用,則可以相互替換。
這里, puts
被替換為printf
因為puts
更簡單(它不解釋%
格式並且它不是可變參數),因此更快。 在這種情況下,允許編譯printf
puts
替換printf
,因為打印字符串不需要解釋任何格式說明符,並且字符串碰巧以\\n
結尾。
這只是一個優化。 編譯器用puts("smth")
替換printf("smth\\n")
,因為輸出相同但puts()
應該更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.