《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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。