随笔分类 -  Linux程序编译及链接

golang语言编译的二进制可执行文件为什么比 C 语言大(转载)
摘要:最近一位朋友问我“为什么同样的hello world 入门程序”为什么golang编译出来的二进制文件,比 C 大,而且大很多。我做了个测试,来分析这个问题。C 语言的hello world程序: 1 2 3 4 5 #include <stdio.h> int main() { printf("h 阅读全文

posted @ 2018-04-04 13:11 沐浴凌风 阅读(825) 评论(0) 推荐(0) 编辑

Linux 链接详解----动态链接库
摘要:静态库的缺点: 动态库: 是一个目标文件,包含代码和数据,它可以在程序运行时动态的加载并链接。修改动态库不需要重新编译目标文件,只需要更新动态库即可。动态库还可以同时被多个进程使用。在linux下生成动态库 gcc -c a.c -fPIC -o a.o gcc -shared -fPIC a.o 阅读全文

posted @ 2017-12-07 16:38 沐浴凌风 阅读(9986) 评论(2) 推荐(2) 编辑

Linux 链接详解----静态链接实例分析
摘要:由Linux链接详解(1)中我们简单的分析了静态库的引用解析和重定位的内容, 下面我们结合实例来看一下静态链接重定位过程。 实例中使用了如上代码, 在a.c 中是我们的入口函数main 和定义的全局变量a,其中引用了函数add 它的定义在b.c中。在b.c中又引用了a.c中a的定义。我们先将其分别编 阅读全文

posted @ 2017-12-05 13:02 沐浴凌风 阅读(627) 评论(0) 推荐(0) 编辑

Linux 链接详解(2)
摘要:可执行文件加载执行过程: 上一节我们说到ELF文件格式,静态库的符号解析和重定位的内容。这一节我们来分析一下可执行文件。 由上一节我们知道可执行文件也是ELF文件,当程序被加载器加载到内存时是按照ELF格式去解析,然后把可执行文件的不同节加载到虚拟地址空间中。我们看一下32位下的进程虚拟地址模型: 阅读全文

posted @ 2017-11-17 12:39 沐浴凌风 阅读(381) 评论(0) 推荐(0) 编辑

Linux 链接详解(1)
摘要:可执行文件的生成过程: hello.c 预处理 > hello.i 编译 > hello.s 汇编 > hello.o 链接 >hello 加载 >hello进程 其中预处理器根据hello.c中的#开头的命令解析, 如将include 头文件放在此处,选择条件编译等等; 编译阶段 就是将.i 文件 阅读全文

posted @ 2017-11-16 14:43 沐浴凌风 阅读(1693) 评论(0) 推荐(0) 编辑

导航