《Programming from the Ground Up》閱讀筆記:p117-p146

codists發表於2024-09-29

《Programming from the Ground Up》學習第8天,p117-p146總結,總計30頁。

一、技術總結

1.共享函式用法示例

(1)不使用共享函式

linux.s:

# filename:linux.s

# system call numbers(按數字大小排列,方便檢視)
.equ SYS_READ, 0
.equ SYS_WRITE, 1
.equ SYS_OPEN, 2
.equ SYS_CLOSE, 3
.equ SYS_EXIT, 60

# standard file descriptors
.equ STDIN, 0
.equ STDOUT, 1
.equ STDERR, 2

# common status codes
.equ END_OF_FILE, 0

helloworld-nolib.s:

#filename: helloworld-nolib.s
# 編譯命令:
 # as helloworld-nolib.s -o helloworld-nolib.o
 # ld helloworld-nolib.o -o helloworld-lib
.include "linux.s"

.section .data
helloworld:
	.ascii "hello world\n"
helloworld_end:
	#helloworld_end - helloworld的意思:
	.equ helloworld_len, helloworld_end - helloworld
.section .text
	.global _start

_start:
	#write涉及到SYS_WRITE,
	movq  $SYS_WRITE, %rax
    movq  $STDOUT, %rdi
    movq  $helloworld, %rsi
    movq  $helloworld_len, %rdx
    syscall
    
	# 退出函式: exit()
    movq  $SYS_EXIT, %rax
    movq  $0, %rdi
    syscall

執行helloworld-nolib結果:

# ./helloworld-nolib
hello world

(2)使用共享函式:print、exit

helloworld-lib.s:

# filename: helloworld-lib.s
# 編譯命令:
 # as helloworld-lib.s -o helloworld-lib.o
 # ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o helloworld-lib helloworld-lib.o -lc
.section .data
helloworld:
    .ascii "hello world\n\0"

.section .text
    .globl _start
    
_start:
    movq $helloworld, %rdi
    call printf # C語言中的printf
    movq $0, %rdi
    call  exit # C語言中的exit

執行helloworld-lib結果:

# ./helloworld-nolib
hello world

2.問題:-bash: ./helloworld-lib: No such file or directory

  • 問題描述

    root@LAPTOP-5PGRQ2IO:/mnt/d/Projects/AssemblyProjects# ld -dynamic-linker /lib/ld-linux.so.2 -o helloworld-lib helloworld-lib.o -lc
    root@LAPTOP-5PGRQ2IO:/mnt/d/Projects/AssemblyProjects# ll
    total 96
    drwxrwxrwx 1 root root  4096 Sep 28 15:48 ./
    drwxrwxrwx 1 root root  4096 Jun 24 07:23 ../
    -rwxrwxrwx 1 root root   147 Aug 25 16:18 add-year.s*
    -rwxrwxrwx 1 root root  1075 Aug 31 18:55 count-chars.s*
    -rwxrwxrwx 1 root root   112 Aug 25 16:26 error-exit.s*
    -rwxrwxrwx 1 root root   863 Jul  1 23:39 exit.s*
    -rwxrwxrwx 1 root root 14048 Sep 28 15:48 helloworld-lib*
    -rwxrwxrwx 1 root root   920 Sep 28 15:47 helloworld-lib.o*
    -rwxrwxrwx 1 root root   224 Sep  2 08:43 helloworld-lib.s*
    -rwxrwxrwx 1 root root  9224 Sep 28 15:44 helloworld-nolib*
    -rwxrwxrwx 1 root root  1208 Sep  2 08:39 helloworld-nolib.o*
    -rwxrwxrwx 1 root root   510 Sep  2 08:39 helloworld-nolib.s*
    -rwxrwxrwx 1 root root   264 Aug 24 17:52 linux.s*
    -rwxrwxrwx 1 root root   774 Jul  3 06:25 maximum.s*
    drwxrwxrwx 1 root root  4096 Aug 25 16:20 pgu_64-master/
    -rwxrwxrwx 1 root root  2318 Jul 16 07:52 power.s*
    -rwxrwxrwx 1 root root   453 Aug 24 18:14 read-record.s*
    -rwxrwxrwx 1 root root  1333 Aug 24 18:15 read-records.s*
    -rwxrwxrwx 1 root root   117 Aug 23 08:23 record-def.s*
    -rwxrwxrwx 1 root root   984 Aug 24 17:58 test.dat*
    -rwxrwxrwx 1 root root  5612 Jul 27 11:47 toupper.s*
    -rwxrwxrwx 1 root root  1128 Aug 24 17:57 write-record.o*
    -rwxrwxrwx 1 root root   686 Aug 24 17:54 write-record.s*
    -rwxrwxrwx 1 root root 10816 Aug 24 17:58 write-records*
    -rwxrwxrwx 1 root root  2632 Aug 24 17:57 write-records.o*
    -rwxrwxrwx 1 root root  2081 Aug 24 17:57 write-records.s*
    root@LAPTOP-5PGRQ2IO:/mnt/d/Projects/AssemblyProjects# ./helloworld-lib
    -bash: ./helloworld-lib: No such file or directory
    

    在執行 ./helloworld-lib 命令時提示 -bash: ./helloworld-lib: No such file or directory,但 helloworld-lib 實際上是存在的。

  • 原因分析

    /lib/ld-linux.so.2用於32位可執行檔案,本人的系統是64位的WSL Ubuntu22.04,檢視該檔案是否存在:

    # ls /lib/ld-linux.so.2
    ls: cannot access '/lib/ld-linux.so.2': No such file or directory
    

    執行 ls /lib/ld-linux.so.2 命令可以發現系統中沒有 /lib/ld-linux.so.2 這個檔案,所以雖然執行ld命令時沒有報錯,但是執行 ./helloworld-lib 命令時報錯了:-bash: ./helloworld-lib: No such file or directory。

  • 解決方法

    因為電腦是 64 位的,所以使用 /lib64/ld-linux-x86-64.so.2 而不是 /lib/ld-linux.so.2:

    ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o helloworld-lib helloworld-lib.o -lc
    

二、英語總結

1.majorly

p129, Code that is copied often has to be majorly modified to fit the surrounding code.在這裡,majorly既可以指“量”也可以指“質”上的巨大修改。

三、其它

上一次閱讀還是2024/8/24,期間因為工作上一些不愉快的事一直沒有抽離出來,今天算是慢慢調整過來了,繼續幹。

四、參考資料

1. 程式設計

(1)Jonathan Bartlett,《Programming From The Ground Up》:https://book.douban.com/subject/1787855/

2. 英語

(1)Etymology Dictionary:https://www.etymonline.com

(2) Cambridge Dictionary:https://dictionary.cambridge.org

歡迎搜尋及關注:程式設計人(a_codists)

相關文章