CSAPP讀書筆記(20180214)
準備活動:Dont panic
環境:WSL+一個好用的terminal。見:https://blog.jae.sh/article/89x3w9.html
將軟體源配置成TUNA源。見:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
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
編譯系統的構成:預處理器、編譯器、彙編器和鏈接器
- 預處理階段。預處理器(cpp)根據以字元#開頭的命令,修改原始的C程序。即將頭文件中內容插入到程序文本中從而得到另外一個C程序hello.i。
- 編譯階段。編譯器(ccl)將文本文件hello.i翻譯成文本文件hello.s,其包含一個彙編語言程序。該程序包含函數
main
的定義。 - 彙編階段。接下來,彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程序(relocatable object program)的格式,並將結果保存在目標文件hello.o(二進位文件,用文本編輯器打開是亂碼,而且無法用bash命令執行)中。
- 鏈接階段。將調用的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讀書筆記20180216推薦閱讀:
TAG:計算機科學 | 深入理解計算機系統書籍 | 讀書筆記 |