many, many chore
This commit is contained in:
FallenYing
2023-07-28 09:30:17 +08:00
parent b043fd1d05
commit f501a6b993
33 changed files with 453 additions and 453 deletions

View File

@@ -1,6 +1,6 @@
# Inline Assembly 与链接加载
# Inline Assembly
## Inline Assembly
可以在 C 代码里嵌入汇编语言的骚操作。毕竟编译器本身也就是个复制,翻译,,粘贴的过程。
@@ -14,7 +14,7 @@ C 艹可能没那么容易了····比如说虚函数调用,那你就不太
当然这里可以参考 c inline Asm 的教程 但是已经脱离了本文的主题了
这里给指条路 [https://dmalcolm.fedorapeople.org/gcc/2015-08-31/rst-experiment/how-to-use-inline-assembly-language-in-c-code.html](https://dmalcolm.fedorapeople.org/gcc/2015-08-31/rst-experiment/how-to-use-inline-assembly-language-in-c-code.html)
这里给指条路 [How to Use Inline Assembly Language in C Code](https://dmalcolm.fedorapeople.org/gcc/2015-08-31/rst-experiment/how-to-use-inline-assembly-language-in-c-code.html)
> 诸如 Go 的高级语言 也可以通过 inline C 来 内链汇编
@@ -24,17 +24,17 @@ C 艹可能没那么容易了····比如说虚函数调用,那你就不太
当然,你可以通过 RTFM 来将 C 语言的变量塞到汇编中处理。
在 Windows 平台下 VS 没有 Code 可以以 `__asm {}` 代码块来进行实验 但是注意 只能在 x86 模式下使用 x64 不支持 可以参考 [https://docs.microsoft.com/zh-tw/cpp/assembler/inline/asm?view=msvc-170](https://docs.microsoft.com/zh-tw/cpp/assembler/inline/asm?view=msvc-170)
在 Windows 平台下 VS 没有 Code 可以以 `__asm {}` 代码块来进行实验 但是注意 只能在 x86 模式下使用 x64 不支持 可以参考 [__asm](https://docs.microsoft.com/zh-tw/cpp/assembler/inline/asm?view=msvc-170)
以上两种平台的方案都其实本质是编译器特殊宏 并不包括在 C 的标准内 所以要针对不同的编译器 寻找对应的文档
# 静态链接
## 静态链接
当你使用 GCC 生成可执行文件./a.out 时,到底发生了什么?
为什么就可以直接执行呢?当你问及这个问题时,那么就大有一番探索的空间了
# 链接器
## 链接器
链接器的功能:将一个可执行程序所需的目标文件和库最终整合在一起。
@@ -42,15 +42,13 @@ C 艹可能没那么容易了····比如说虚函数调用,那你就不太
这个就是帮你和外部库连接起来的重要部分。
一个程序包含三个段:.text 、.data 和 .bss 段。
一个程序包含三个段:.text、.data 和 .bss 段。
```
而各目标文件和库都包含这三段所以ld 链接器的功能就是将各个目标文件和库的三段合并在一起。
当然,链接器所完成的链接工作并非只是简单地将各个目标文件和库的三段内存堆砌在一起,而是还要完成 “重定位” 的工作。
```
当然,链接器所完成的链接工作并非只是简单地将各个目标文件和库的三段内存堆砌在一起,而是还要完成“重定位”的工作。
## 查看二进制文件的工具
### 查看二进制文件的工具
使用 objdump 查看 data 节的 xy
@@ -60,7 +58,7 @@ C 艹可能没那么容易了····比如说虚函数调用,那你就不太
使用 IDA BinaryNInja 一类反汇编工具
# 动态链接
## 动态链接
静态链接一次用那么多,实在是太大太大了
@@ -74,7 +72,7 @@ Linux 下一般是 .so 如果你看到了 .a 那个一般是 archive 的缩写
使用动态链接的好处在于 可以热加载和热更新
# 共享连接的加载
## 共享连接的加载
使用 ldd 来查看 a.out 就可以查看动态链接库