写点什么

《Programming from the Ground Up》阅读笔记:p117-p146

作者:codists
  • 2024-09-29
    广东
  • 本文字数:2344 字

    阅读完需:约 8 分钟

《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 .datahelloworld: .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-nolibhello 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 .datahelloworld:    .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-nolibhello 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)

用户头像

codists

关注

公众号:编程人 2021-01-14 加入

Life is short, You need Python

评论

发布
暂无评论
《Programming from the Ground Up》阅读笔记:p117-p146_汇编_codists_InfoQ写作社区