揭开链接器的面纱
深度分析
解决方案
通过内嵌汇编自定义打印函数和退出函数(INT 0x80)
通过链接叫吧自定义入口函数(不依赖任何库和GCC内置功能)
删除可执行程序中的无用信息(无用断信息,无用信息删除)
打印函数设计
void print(const char *str, int l) {
asm volatile(
"movl $4, %%eax\n" //sys_write 指令4
"movl $1, %%ebx\n" // 打印屏幕
"movl %0, %%ecx\n" //输入字符串
"movl %1, %%edx\n"//输入字符串个数
"int $0x80\n"
:
:"r"(str), "r"(l) //输入寄存器
:"eax", "ebx", "ecx", "edx");//保留基寄存器
}
退出函数设计
void exit(int code) {
asm volatile(
"movl $1, %%eax\n" //exit 指令编号1
"movl $42, %%ebx\n"
"int $0x80 \n"
:
:"r"(code)
:"eax", "ebx"
);
}
链接脚本设计
ENTRY(program)
SECTION
{
.text 0x8400000
{
*()
}
}