链接器的应用(八)

  

,,,,,,,,在上节博客中,我们介绍了链接器的相关概念。那么在本节,我们就继续来看看链接器,看看它在工程实践中的应用。我们在本节中做一个实验,来模拟在嵌入式中的开发。

,,,,,,,,实验的目标:

,,,,,,,,,,, <强>,,,,,1,编写一个“体积受限”的可执行程序;

<>强,,,,,,,,,,,,,,,,2,通过makefile完成代码编译,

<>强,,,,,,,,,,,,,,,,3,运行后在屏幕上打印“D.T.Software”

,,,,,,,,那么这个目标看似很简单,我们在初学编程时就直接打印经典的hello world。其效果类似,经典的代码是

# include  & lt; stdio.h>      int  main ()   {   ,,,printf (“D.T.Software");   ,,,,   ,,,return  0;   }

,,,,,,,,当然这个代码也能运行,但是我们的要求是体积受限。什么是体积受限呢?我们都知道,在嵌入式的开发中,内存是很少的。因此节省内存成立必不可少的因素,因此我们必须要去掉库文件所包含的一些额外的信息,只保留打印语句所需要代码即可。那么我们来深度分析下,如何进行开发呢?无疑是直接用汇编代码进行编写,然后编写链接脚本自定义入口地址了。思路如下

链接器的应用(八)

,,,,,,,,由上可知,我们的解决方案可由以下几部分完成:

,,,,,,,,, <强>,,,,,,,1,通过内嵌汇编自定义打印函数和退出函数(INT 80 h);

<强>,,,,,,,,,,,,,,,,2,通过链接脚本自定义入口函数(不依赖于任何库和GCC内置功能),

<强>,,,,,,,,,,,,,,,,3,删除可执行程序中的无用信息(无用段信息,调试信息等)。

,,,,,,,,打印函数设计如下

void 打印(const  char *,年代,int  l)   {   ,,,asm  volatile  (   ,,,,,,,“movl  4美元,,% % eax \ n",,,,//sysy_write   ,,,,,,,“movl  1美元,,% % ebx \ n"   ,,,,,,,“movl  % 0,, % % ecx \ n"   ,,,,,,,“movl  % 1,, % % edx \ n"   ,,,,,,,“int 美元0 x80 ,,,, \ n",,,,//80 h 服务   ,,,,,,,,   ,,,,,,,:,“r" (s),“r"(1),,,,,,//参数   ,,,,,,,:,“eax",,“ebx",,“ecx",,“edx");   }

,,,,,,,,退出函数设计如下

void 退出(int 代码)   {   ,,,asm  volatile  (   ,,,,,,,“movl  1美元,,% % eax \ n",,,,//sys_exit   ,,,,,,,“movl  % 0,, % % ebx \ n"   ,,,,,,,“int 美元0 x80 ,,,, \ n",,,,//80 h 服务   ,,,,,,,,   ,,,,,,,:,“r"(代码),,,,,,,,,,,,,//参数   ,,,,,,,:,“eax",,“ebx");   }

,,,,,,,,链接脚本设计如下

条目(程序),,,,//,指定入口函数      部分   {   ,,,.text  0 x08048000  +, SIZEOF_HEADRS :   ,,,{   ,,,,,,,* (。text),,,,//,将目标文件中的这两个段合并进入到可执行程序中   ,,,,,,,* (.rodata)   ,,,}   ,,,,   ,,,/报废/,:   ,,,{   ,,,,,,,*(*),,,//,放弃所有目标文件中除,.test 和,.rodata 之外的其他段   ,,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

链接器的应用(八)