链接器下——链接器实战
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,链接器实战1目标模拟嵌入式开发,编写一个"体积受限"的可执行程序,通过makefile 完成编译, 运行后打印"D.T.Software"传统的写法:test.c#include void main(
千家信息网最后更新 2025年02月03日链接器下——链接器实战
链接器实战
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安全错误
数据库的锁怎样保障安全
网络安全隐患排查记录隐患
数据库基础教程第二版考试
梦幻诛仙09年追加服务器
长沙 招聘 数据库
网络安全知识考什么
三亚微商直播软件开发
ai 炒股软件开发
软件开发项目管理全过程
该数据库中的字符数怎么改
如何建立网络安全防护体系
成都人工智能软件开发工程师
互联网科技手工活
连接另一redis数据库
软件开发团队组建与职责
宁河区网络安全应急指挥中心
设计键值数据库的第一目标
电子小报模板免费下载网络安全
德州网络安全课
冒险岛最新服务器
sql数据库客户端许可证价格
广州手机软件开发大概多少钱
nfs服务器有读写权限
万方数据库发表论文的步骤
大型企业mes数据库
网络安全宣传晚会视频
国内互联网科技公司标志
文献型数据库
四个字的软件开发
服务器启不来
余杭网络安全课题