簡體   English   中英

ltrace printf()但顯示puts()

[英]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 (或許多其他常用函數之一),等等上。 編譯器只需要尊重程序的含義,它不需要尊重被調用的實際函數。 由於printfputs是不允許重新定義的標准函數,因此它知道這些函數的功能,並且如果認為它有用,則可以相互替換。

這里, puts被替換為printf因為puts更簡單(它不解釋%格式並且它不是可變參數),因此更快。 在這種情況下,允許編譯printf puts替換printf ,因為打印字符串不需要解釋任何格式說明符,並且字符串碰巧以\\n結尾。

這只是一個優化。 編譯器用puts("smth")替換printf("smth\\n") ,因為輸出相同但puts()應該更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM