GO 的静态链接
学了很多新内容 之前没接触过这部分 今天复习巩固了静态链接的知识。
可以发现从 linux/arm64的嵌入式系统到 linux/s390x 的大型机系统,再到Windows、linux和 darwin(mac)这样的主流操作系统、amd64、386这样的主流处理器体系,Go 对各种平台和操作系统的支持确实十分广泛。
Go 的运行机制发现 Go 程序是通过 runtime 这个库实现与操作内核系统交互的。Go 自己实现了 runtime,并封装了syscall,为不同平台上的go user level代码提供封装完成的、统一的go标准库。
首先我们来书写两个程序,一个 C语言的一个 Go 语言的:
hello.c
#include
int main() {
printf("Hello, C!\n");
return 0;
}
编译后使用 ldd 命令查看其链接库:
1. 编译
gcc -o hc hello.c
2. 查看其依赖共享库
ldd hc
linux-vdso.so.1 => (0x00007fff85b6e000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe87ff1a000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe8802e8000)
我们发现这个 C程序编译出来后的二进制文件会需要这三个库文件,因此如果我们将它做移植时会因为缺失动态库文件而造成无法运行。