CSAPP讀書筆記(20180214)

準備活動:Dont panic

環境:WSL+一個好用的terminal。見:blog.jae.sh/article/89x

將軟體源配置成TUNA源。見:mirrors.tuna.tsinghua.edu.cn

Chapter 1 計算機系統漫遊

#include <stdio.h>int main(){ printf("hello, world
"); return 0;}

程序是由位元組序列方式存儲的(文本文件與二進位文件)。

系統中所有的信息——包括磁碟文件、內存中的程序、內存中存放的用戶數據以及網路上傳送的數據,都是由一串比特表示的。區分不同數據對象的唯一方法是我們讀到這些數據對象時的上下文。

從源文件到目標文件的轉化:編譯器驅動程序(gcc)

addwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ gcc -o hello hello.c

addwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ lshello hello.c

執行HelloWorld程序:

addwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ ./hellohello, world

編譯系統的構成:預處理器、編譯器、彙編器和鏈接器

  1. 預處理階段。預處理器(cpp)根據以字元#開頭的命令,修改原始的C程序。即將頭文件中內容插入到程序文本中從而得到另外一個C程序hello.i。
  2. 編譯階段。編譯器(ccl)將文本文件hello.i翻譯成文本文件hello.s,其包含一個彙編語言程序。該程序包含函數main的定義。
  3. 彙編階段。接下來,彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程序(relocatable object program)的格式,並將結果保存在目標文件hello.o(二進位文件,用文本編輯器打開是亂碼,而且無法用bash命令執行)中。
  4. 鏈接階段。將調用的printf函數(存在於printf.o文件中)由鏈接器(ld)合併到hello文件中。

addwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ gcc -Og -S hello.caddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ lshello hello.c hello.saddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ cat hello.s .file "hello.c" .section .rodata.str1.1,"aMS",@progbits,1.LC0: .string "hello, world" .text .globl main .type main, @functionmain:.LFB23: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movl $.LC0, %edi call puts movl $0, %eax addq $8, %rsp .cfi_def_cfa_offset 8 ret .cfi_endproc.LFE23: .size main, .-main .ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.6) 5.4.0 20160609" .section .note.GNU-stack,"",@progbitsaddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ lshello hello.c hello.saddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ gcc -Og -c hello.caddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ lshello hello.c hello.o hello.saddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ cat hello.oELF>?@@H????H??hello, worldGCC: (Ubuntu 5.4.0-6ubuntu1~16.04.6) 5.4.0 20160609zRx D?? hello.cmainputs???????? .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.comment.note.GNU-stack.rela.eh_frame @?0@0e5I?^?Y@ &XX12X 8h? ?addwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ bash hello.ohello.o: hello.o: cannot execute binary fileaddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ lshello hello.c hello.o hello.saddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$ ./hellohello, worldaddwater@DESKTOP-T17GFPA:~/CSAPP/Chapt1$

下一篇:

PyW:doge年第一更!CSAPP讀書筆記20180216zhuanlan.zhihu.com圖標
推薦閱讀:

TAG:計算機科學 | 深入理解計算機系統書籍 | 讀書筆記 |