首页 > 解决方案 > 使用 autoconf 为汇编语言程序创建构建脚本

问题描述

我正在尝试学习 autoconf 并尝试使用它来创建构建脚本,以编译用 Gnu Assember(GAS) 编写的汇编语言程序。

下面是我的configure.ac

   AC_INIT([hello], [0.01]])
   AC_CONFIG_SRCDIR([hello.s])
   AC_CONFIG_HEADERS([config.h])
   AC_CONFIG_AUX_DIR([build-aux])

   AM_INIT_AUTOMAKE([-Wall -Werror])
   AC_CONFIG_FILES([Makefile])
   AM_PROG_AS
   AC_OUTPUT

下面是 Makefile.am

  bin_PROGRAMS = hello
  hello_SOURCES = hello.s

  .hello.o:
          as -gstabs+  $< -o $@

下面是 hello.s 程序

    .section .text
    .globl _start
    _start:
          pushl $3
          pushl $2
          call foo
          movl $1, %eax
          int $0x80

    .type foo, @function
    foo:
         movl 4(%esp), %eax
         movl 8(%esp), %ebx
         addl %eax, %ebx
         ret

当我运行 autoreconf -ii 看到这个:

  configure.ac:6: installing `build-aux/install-sh'
  configure.ac:6: installing `build-aux/missing'

运行 ./configure 脚本

   checking for a BSD-compatible install... /usr/bin/install -c
   checking whether build environment is sane... yes
   checking for a thread-safe mkdir -p... /bin/mkdir -p
   checking for gawk... gawk
   checking whether make sets $(MAKE)... yes
   checking for style of include used by make... GNU
   checking for gcc... gcc
   checking for C compiler default output file name... a.out
   checking whether the C compiler works... yes
   checking whether we are cross compiling... no
   checking for suffix of executables... 
   checking for suffix of object files... o
   checking whether we are using the GNU C compiler... yes
   checking whether gcc accepts -g... yes
   checking for gcc option to accept ISO C89... none needed
   checking dependency style of gcc... none
   checking dependency style of gcc... none
   configure: creating ./config.status
   config.status: creating Makefile
   config.status: creating config.h
   config.status: executing depfiles commands

当我运行 make install 它失败并出现以下错误:,我想使用“as”而不是 gcc 来组装汇编语言。

   [foobar]$ make install
   gcc  -g -O2 -c -o hello.o hello.s
   gcc  -g -O2   -o hello hello.o  
   hello.o: In function `_start':
   /home/ashok/practice/ia32/myasm/autotools/foobar/hello.s:4: multiple    definition of `_start'
  /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o:(.text+0x0): first defined here
 /usr/lib/gcc/i686-redhat-linux/4.4.7/../../../crt1.o: In function `_start':
 (.text+0x18): undefined reference to `main'
  collect2: ld returned 1 exit status
  make: *** [hello] Error 1

我希望 autoconf 使用“as”GNU 汇编程序而不是 gcc 来编译汇编程序。我如何覆盖不使用 gcc。

标签: autoconfautomakegnu-assemblerautoreconf

解决方案


我能够通过使用 gcc 本身来编译和链接 Makefile.am 中的汇编程序 pass pert target LDFLAGS 来解决这个问题

 bin_PROGRAMS = hello
 hello_SOURCES = hello.s
 hello_LDFLAGS=-nostdlib -lgcc -Wl,-e_start

configure.ac 基本保持不变。

    AC_INIT([hello], [0.01])
    AC_CONFIG_SRCDIR([hello.s])
    AC_CONFIG_HEADERS([config.h])
    AC_CONFIG_AUX_DIR([build-aux])
    AM_INIT_AUTOMAKE([-Wall -Werror])
    AC_CONFIG_FILES([Makefile])
    AM_PROG_AS
    AC_OUTPUT

运行 autoreconf -i

  $ autoreconf -i
  configure.ac:5: installing `build-aux/install-sh'
  configure.ac:5: installing `build-aux/missing'

运行 ./config

 $ ./configure 
 checking for a BSD-compatible install... /usr/bin/install -c
 checking whether build environment is sane... yes
 checking for a thread-safe mkdir -p... /bin/mkdir -p
 checking for gawk... gawk
 checking whether make sets $(MAKE)... yes
 checking for style of include used by make... GNU
 checking for gcc... gcc
 checking for C compiler default output file name... a.out
 checking whether the C compiler works... yes
 checking whether we are cross compiling... no
 checking for suffix of executables... 
 checking for suffix of object files... o
 checking whether we are using the GNU C compiler... yes
 checking whether gcc accepts -g... yes
 checking for gcc option to accept ISO C89... none needed
 checking dependency style of gcc... none
 checking dependency style of gcc... none
 configure: creating ./config.status
 config.status: creating Makefile
 config.status: creating config.h
 config.status: executing depfiles commands

运行制作

$ make
  make  all-am
  make[1]: Entering directory `/home/ashok/practice/ia32/myasm/autotools/foobar'
  gcc  -g -O2 -c -o hello.o hello.s
  gcc  -g -O2 -nostdlib -lgcc -Wl,-e_start  -o hello hello.o  
  make[1]: Leaving directory `/home/ashok/practice/ia32/myasm/autotools/foobar'

运行你好程序

 $ ./hello 
 $ echo $?
 5

推荐阅读