0
votes

I am trying to learn autoconf and trying to use it to create build scripts for compiling Assembly language programs written in Gnu Assember(GAS).

Below is my 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

And below is Makefile.am

  bin_PROGRAMS = hello
  hello_SOURCES = hello.s

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

Below is the hello.s program

    .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

when i run autoreconf -i i see this:

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

Running ./configure script

   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

when i run make install it fails with below errors:, I want to use "as" instead of gcc to assemble the assemble language.

   [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

I want autoconf to use "as" GNU assembler instead of gcc to compile the Assembly program. How do i override to not use gcc.

1

1 Answers

0
votes

I was able to resovle this by using gcc itself to compile and link the assembly program pass pert target LDFLAGS in Makefile.am

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

the configure.ac remains mostly same.

    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

Run autoreconf -i

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

Run ./configure

 $ ./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

Run Make

$ 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'

Run the hello program

 $ ./hello 
 $ echo $?
 5