程式設計師的自我修養 勘誤表

2021-08-20 13:07:33 字數 4708 閱讀 6784

謝謝你們的辛勤勞動,【程式設計師的自我修養】真的不錯,花一周時間看完後,把以前的東西都串起來了,在看的過程中,發現一些小瑕疵,看到順便記下,要在以後的版本中修改就更完美了。我購買的是2023年5月第9次印刷版。

1. 60頁

.錯誤: 所以記憶體中只須要儲存乙份改程式的指令部分

.正確: 所以記憶體中只須要儲存乙份該程式的指令部分

*改 -> 該

2. 74頁

.錯誤: elf檔案的段結構就是由段表決定的,編譯器、鏈結器和裝載器都是依靠段表來定位和訪問各個段的屬性的。

.正確: elf檔案的段結構就是由段表決定的,鏈結器和裝載器都是依靠段表來定位和訪問各個段的屬性的。

*編譯器階段還沒有段表吧,也就沒有依靠段表一說了。

3. 82頁,84頁

.錯誤: 該成員低4位表示符號的型別(symbol type),高28位表示符號繫結資訊(symbol binding)

.正確: 該成員低4位表示符號的型別(symbol type),高4位表示符號繫結資訊(symbol binding)

*符號型別和繫結資訊(st_info)的資料型別為: unsigned char,不可能有高28位一說。

4. 85頁

.錯誤: global_init_var是已初始化的全域性變數,它被定義在.bss段,即下標為3

.正確: global_init_var是已初始化的全域性變數,它被定義在.data段,即下標為3

*已經初期化的全域性變數應該在.data段

5. 89頁

.錯誤: gcc會將它們的符號名分別修飾成兩個不同的名字_zz4maine3foo和_zz4funcve3foo

.正確: gcc會將它們的符號名分別修飾成兩個不同的名字_zz4maine3foo和_zz4funce3foo

*func()函式裡的靜態變數foo的名字應該是_zz4funce3foo,而不是_zz4funcve3foo

6. 107頁

.錯誤: 如果**段「.data」有要被重定位的地方,就會有乙個相對應叫「.rel.data」的段儲存了資料段的重定位表。

.正確: 如果資料段「.data」有要被重定位的地方,就會有乙個相對應叫「.rel.data」的段儲存了資料段的重定位表。

*「.data」應該是資料段,而不是**段

7. 109頁

.錯誤: 對照前面a.o的重定位資訊,我們可以看到第乙個重定位入口是對swap符號的引用,

.正確: 對照前面a.o的重定位資訊,我們可以看到第二個重定位入口是對swap符號的引用,

*swap符號是第二個重定位入口,而不是第乙個。與前面不符。

8. 125頁

.錯誤: write呼叫的呼叫號為4,則eax=0。

.正確: write呼叫的呼叫號為4,則eax=4。

*eax應該為4,而不是0

9. 126頁

.錯誤: 關於系統庫已經系統呼叫的細節我們在這裡不詳細展開,將在第12章進行更為詳細的介紹。

.正確: 關於系統庫以及系統呼叫的細節我們在這裡不詳細展開,將在第12章進行更為詳細的介紹。

*「已經」的意思不好理解,改為「以及」容易理解一些。

10. 131頁

.錯誤: [a-z]*(.text*[a-z])這個條件比較複雜,它表示所有輸入檔案中以小寫字母a到z開頭的檔案中所有段名以.text開頭,

.正確: [a-z]*(.text*[a-z])這個條件比較複雜,它表示所有輸入檔案中,檔名為小寫字母組合成的檔案中所有段名以.text開頭,

*不只是以小寫字母a到z開頭,而整個檔名都是小寫字母吧?

11. 134頁

.錯誤: 乙個段可以包含**,資料或其他資訊,在pe/coff檔案中,至少包含乙個**段,

.正確: 乙個檔案可以包含**,資料或其他資訊,在pe/coff檔案中,至少包含乙個**段,

*乙個段應該包含不了**,資料等等,應該是檔案。

12. 135頁

.錯誤: 就表示把所有全域性變數「global」放到「foo」段裡面去,然後再使用「#pragram」

.正確: 就表示把全域性變數「global」放到「foo」段裡面去,然後再使用「#pragram」

*就乙個全域性變數「global」,說成所有,有點不妥。

13. 142頁

.錯誤: 第四列是符號型別,可以看到對於c語言的符號,coff只區分了兩種,一種是變數和其他符號,類行為notype,

.正確: 第四列是符號型別,可以看到對於c語言的符號,coff只區分了兩種,一種是變數和其他符號,型別為notype,

*不是類行,而是型別 ^-^

14. 142頁

.錯誤: 另外還有乙個為$sg574的符號,其實它表示的是程式中的那個「%d\n」字串常量。

.正確: 另外還有乙個為$sg594的符號,其實它表示的是程式中的那個「%d\n」字串常量。

*參照141頁中輸出的符號表資訊,應該是$sg594,而不是574

15. 154頁

.錯誤: 由於模組a和模組b之間相互呼叫依賴關係,我們可以把模組a和模組b在記憶體中「相互覆蓋」,

.正確: 由於模組a和模組b之間無相互呼叫依賴關係,我們可以把模組a和模組b在記憶體中「相互覆蓋」,

*加上「無」依賴關係,意思很容易理解

16. 159頁

.錯誤: 然後在物理記憶體中分配乙個物理頁面,將程序中該虛擬頁與分配的物理頁之間建立對映關係,

.正確: 然後在物理記憶體中分配乙個物理頁面,將缺頁部分的可執行檔案資料讀入記憶體,然後將程序中該虛擬頁與分配的物理頁之間建立對映關係,

*可執行檔案的資料讀入記憶體,應該加上。當然分配乙個物理頁面中包括了的話,那就另說了。

17. 165頁

.錯誤: 表6-2中 成員列 p_memse

.正確: 表6-2中 成員列 p_memsz

*應該為p_memsz

18. 172頁

.錯誤: 圖6-12 中0xbf801fde

.正確: 圖6-12 中0xbf801fdd

*引數「123」的位址應該為0xbf801fdd,而不是0xbf801fde

19. 180頁

.錯誤: 靜態鏈結這種方法的確簡單,原理上很容易理解,實踐上很難實現,

.正確: 靜態鏈結這種方法的確簡單,原理上很容易理解,實踐上很容易實現,

*實踐上應該是很容易實現,而不是很難吧。

20. 195頁

.錯誤: 對於模組間呼叫和跳轉,我們也可以採用上面型別四的方法來解決。

.正確: 對於模組間呼叫和跳轉,我們也可以採用上面型別三的方法來解決。

*上面應該是型別三的方法。

21. 200頁

.錯誤: 我們知道動態鏈結比靜態鏈結慢的主要原因是動態鏈結下對於全域性和靜態的資料訪問都要進行複雜的got定位,

.正確: 我們知道動態鏈結比靜態鏈結慢的主要原因是動態鏈結下對於全域性資料訪問都要進行複雜的got定位,

*靜態資料訪問不需要通過got定位吧。

22. 268頁

.錯誤: 經過調整後的指令應該是: mov dword ptr [0x20001000], 0x100

.正確: 經過調整後的指令應該是: mov dword ptr [0x20000000], 0x100

*基位址不是0x20001000,而是0x20000000

23. 289頁

.錯誤: 這段彙編大致等價於如下偽**: edi = ebp - 0x0c;

.正確: 這段彙編大致等價於如下偽**: edi = ebp - 0xc0;

*堆疊應該是擴大了0xc0位元組,而不是0x0c位元組。

24. 296頁

.錯誤: 圖10-11中,push 1對應的堆疊圖,main的棧: 1->3

.正確: 圖10-11中,push 1對應的堆疊圖,main的棧: 3->1

*先push的3,後push的1,所以位置應該要調換

25. 297頁

.錯誤: 圖10-12中,printf("y=%d", y)對應的堆疊中,只有引數y

.正確: 圖10-12中,printf("y=%d", y)對應的堆疊中,應該有引數y和引數"y=%d"的位址

*當然如果僅僅是為了說明,複雜的位址說明,省略也罷。

26. 307頁(308頁)

.錯誤: 為了回答這個問題,就不得不再回頭自習研究一下圖9-1了。

.正確: 為了回答這個問題,就不得不再回頭自習研究一下圖10-1了。

*應該是圖10-1

27. 308頁

.錯誤: (其中可執行檔案占去一部分、0x080 400 000之前的位址占去一部分,棧占去一部分、共享庫占去一部分)。

.正確: (其中可執行檔案占去一部分、0x0800 4000之前的位址占去一部分,棧占去一部分、共享庫占去一部分)。

*位址0x080 400 000多了乙個0

28. 375頁

.錯誤: 本頁中的**裡面的bufsize變數,應該為buffersize吧。

*不然跟前面的**就合不上了。話說這是這是庫的**,copy過來應該不會錯,有可能我理解錯了。

29. 419頁

.下面的**有誤:

if(header->size > size + header_size && header->size < size + header_size * 2)

應該修正為:

if(header->size > size + header_size && header->size < size + header_size * 2)

*剛好找到申請的塊後,應該返回退出。

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

對合作夥伴的尊重與包容 每個人的水平必然是不相同,大家各有擅長,並且在不斷進步中。所以遇到同事或者合作的友商犯了比較低階 對你來說可能是 的錯誤是很正常的事情,我們更多的是應該給與尊重與包容,而不是嘲笑或者消極對待。在不斷的鼓勵同事和合作夥伴之後,能感受到大家對我的信賴,特別是和友商的合作變得非常的...