centos 64位系统编译TinyHelloWorld.c

centos 64位系统编译TinyHelloWorld.c

程序员的自我修养中,有一段是通过内嵌汇编来完成一个HelloWorld程序,这段汇编是32位的,在64位的机器上直接编译就会出问题。

  1. 源代码
/*
 *TinyHelloWorld.c
 */

char* str = "Hello World!\n";

void print(){
    asm( "movl $13,%%edx \n\t"
        "movl  %0,%%ecx \n\t"
        "movl $0,%%ebx \n\t"
        "movl $4,%%eax \n\t"
        "int $0x80     \n\t"
        ::"r"(str):"edx","ecx","ebx");
}

void exit() {
    asm( "movl $42,%ebx \n\t"
        "movl $1,%eax \n\t"
        "int $0x80    \n\t");
}

void nomain() {
    print();
    exit();
}
  1. 编译过程
gcc -c -fno-builtin -m32 TinyHelloWorld.c 

  • -fno-builtin 不使用内置函数

  • -static 使用静态链接的方式来链接程序

  • -e nomain 表示该程序的入口函数为nomain

  • -o TinyHelloWorld 表示指定输出可执行文件名为TinyHelloWorld

原因就是64位的系统不能编译32位的目标文件

解决方案:

用-m32强制用32位API编译,就可以编译通过

gcc -c -fno-builtin -m32 TinyHelloWorld.c
  1. 使用ld链接脚本

TinyHelloWOrld.lds

ENTRY(nomain)

SECTIONS

{

    . = 0x0804800 + SIZEOF_HEADERS;

    tinytext : { * (.text) *(.data) *(.rodata) }

    /DISCARD/ : { *(.coment) }

}
  1. 链接报错

ld -static -e nomain -o TinyHelloWorld TinyHelloWorld.o

链接的时候加上"-m elf_i386"

ld -static -m elf_i386 -e nomain -o TinyHelloWorld TinyHelloWorld.o

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值