GO 的静态链接 Day3 | 青训营

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程序编译出来后的二进制文件会需要这三个库文件,因此如果我们将它做移植时会因为缺失动态库文件而造成无法运行。