autoconf - 使用 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。
解决方案
我能够通过使用 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
推荐阅读
- json - 从 JSON 字典 Pyspark 创建非透视结构
- bash - 在 bash 中完成多个代码构建时如何显示和停止执行?
- c# - 布雷泽。Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 已添加具有相同键的项
- react-native - 使用钩子在 React Native 中获取视图尺寸
- c# - 从 appsettings.json 到 Entity Framework .NET Core 中的 OnConfiguring 方法的连接字符串
- python - 删除 Openpyxl 中的自动分页符
- gcc - 从构建场中构建的可执行文件的 .gcda-s 和本地构建的 .gcno-s 生成覆盖范围
- mongodb - 查询每个文档具有不同限制的最后一个文档
- excel - 来自两个列表的 Excel 嵌套层次结构
- javascript - 如何重新构造数组的动态方式?