链接器下——链接器实战
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,链接器实战1目标模拟嵌入式开发,编写一个"体积受限"的可执行程序,通过makefile 完成编译, 运行后打印"D.T.Software"传统的写法:test.c#include void main(
千家信息网最后更新 2025年12月01日链接器下——链接器实战
链接器实战
1目标
模拟嵌入式开发,编写一个"体积受限"的可执行程序,通过makefile 完成编译, 运行后打印"D.T.Software"
传统的写法:test.c
#include void main(){ print("D.T.Software\n"); return 0;} 今天我们采用全新的方法,达到体积最小的 目标。
2分析过程

3解决方案
1.通过内嵌汇编自定义打印函数和退出函数(INT 80H)
2.通过链接脚本自定入口函数(不依赖任何库和gcc内置功能)
3.删除可执行程序中的无用信息(无用段信息、调试信息、等)
4打印函数设计
void print(const char* s, int l){ asm volatile ( "movl $4, %%eax\n" "movl $1, %%ebx\n" "movl %0, %%ecx\n" "movl %1, %%edx\n" "int $0x80 \n" : : "r"(s), "r"(l) : "eax", "ebx", "ecx", "edx" );}5退出函数设计
void exit(int code){ asm volatile ( "movl $1, %%eax\n" "movl %0, %%ebx\n" "int $0x80 \n" : : "r"(code) : "eax", "ebx" );}6链接脚本设计
ENTRY(program)SECTIONS{ .text 0x08048000 + SIZEOF_HEADERS : { *(.text) *(.rodata) } /DISCARD/ : { *(*) }}7 makefie
CC := gccLD := ldRM := rm -frTARGET := program.outSRC := $(TARGET:.out=.c)OBJ := $(TARGET:.out=.o)LDS := $(TARGET:.out=.lds).PHONY : rebuild clean all$(TARGET) : $(OBJ) $(LDS) $(LD) -static -T $(LDS) -o $@ $< @echo "Target File ==> $@"$(OBJ) : $(SRC) $(CC) -fno-builtin -o $@ -c $^rebuild : clean allall : $(TARGET)clean : $(RM) $(TARGET) $(OBJ)最终的设计:
void print(const char* s, int l);void exit(int code);void program(){ print("D.T.Software\n", 13); exit(0);}void print(const char* s, int l){ asm volatile ( "movl $4, %%eax\n" "movl $1, %%ebx\n" "movl %0, %%ecx\n" "movl %1, %%edx\n" "int $0x80 \n" : : "r"(s), "r"(l) : "eax", "ebx", "ecx", "edx" );}void exit(int code){ asm volatile ( "movl $1, %%eax\n" "movl %0, %%ebx\n" "int $0x80 \n" : : "r"(code) : "eax", "ebx" );}编译后结果对比:(没有对比就没有伤害)
还可以使用strip命令进一步去除无用调试信息:
8指定链接选项
- -ld 命令 // GNU的链接器,将目标文件链接为可执行程序,GCC编译器集成中的一员,重要的幕后工作者
- -ld -static // 指定使用静态链接的方式来产生最终程序,而不是默认的动态链接方式。
- -gcc -fno-builtin //用于关闭GCC 内置函数的功能(GCC提供了很多内置函数(Built-in Function),它会将一些常用的C库函数替换为编译器的内置函数,以达到优化的目的)。
9总结
对于资源受限的嵌入式设备,需要考虑可执行程序的大小,通过内嵌汇编直接使用系统服务能够劈开相关库的使用可以通过如下方法控制可执行程序的体积大小。
1.最小化库的使用(必要情况下考虑自己实现相关函数)
2.自定义链接脚本,删除无用段信息
文章整理参考自狄泰课程。
函数
链接
程序
信息
编译
设计
体积
目标
脚本
最小
功能
命令
大小
嵌入式
方式
方法
编译器
实战
重要
必要
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
离线考试软件开发
所有网络技术标准
网络安全应急预案的概念
国家网络安全周举办的目的
为保证校园网络安全检查简报
郑大数据库应用技术答案
软件开发有几个岗位
英泰软件开发学校
奉贤区基础网络技术常见问题
win10+磁盘管理服务器
人员离职离岗网络安全
网络安全对学历的要求
三明市网络安全教育q
网络存储服务器设备如何安装
建行社会招聘软件开发
git为啥拉不到服务器代码
更改plsql数据库编码
数据库大作业的数据结构怎么写
什么是网络技术排名靠前
zoom不信任的服务器证书
一台服务器连接多台主机方案
用友数据库fd代表什么
怎么创我的世界服务器
服务器内网通心
企业网站模板和数据库
西藏软件开发待遇
加强网络安全意识拒绝钓鱼网站
莱州网络安全保卫大队大队长
安全的外汇软件开发
网络安全行业技术路线