无法使libtool合并yasm创建的目标文件

时间:2016-09-09 14:15:36

标签: c automake libtool yasm

我试图让libtoolyasm一起工作。

yasm从我的.o files来源创建了正确的.asm,但我无法弄清楚如何让libtool构建相关的.lo }和.dep个文件。 它希望构建共享库,并包含.o个文件。

2 个答案:

答案 0 :(得分:0)

libtool生成的文件通常使用以下布局:.lo目录中的build文件,包含位置元数据; .o目录中的静态对象build文件;以及.o目录中的PIC /共享build/.libs对象。

您可以使用libtool编译模式。我不熟悉yasm,所以你必须填写开关。它将运行yasm构建两次,一次使用-DPIC(可能还有其他共享对象选项)。

libtool --tag=CC --mode=compile yasm <options> src.asm

如果使用automake,可能需要.asm文件的明确规则:

.asm.lo:
        $(LIBTOOL) --tag=CC --mode=compile \
        yasm <options> $<

请记住,那些是Makefile中的TAB,而不是(8)空格字符! 您可能还需要在此之前添加:.SUFFIXES: .asm .lo。我使用变量$(LIBTOOL),因为某些平台(例如OSX)需要将其安装为glibtool,这是Makefile.in所做的。

例如src.lo应尊重生成的src.o.libs/src.omake clean

对于您的图书馆libfoo,您需要通过以下方式让automake了解这些来源:EXTRA_libfoo_la_SOURCES = src.asm和obj deps with libfoo_la_LIBADD = src.lo。甚至可能值得添加依赖项:libfoo_la_DEPENDENCIES = src.lo

虽然我不明白为什么仅将src.asm放入libfoo_la_SOURCES是不够的。

答案 1 :(得分:0)

这是有效的(尽管我从未弄清楚如何让libtool在目标目录中创建.lo文件,或者创建目标目录的.libs目录。

Makefile规则:

# Rule to build object files from asm files.
#
# XXX
# Libtool creates the .lo file in the directory where make is run. Move the file
# into place explicitly; I'm sure this is wrong, but have no idea how to fix it.
# Additionally, in a parallel make, the .libs file may not yet be created, check
# as necessary, but ignore errors.
.asm.lo:
        -d=`dirname $@`; test $d/.libs || mkdir $d/.libs
        $(LIBTOOL) --tag=CC --mode=compile sh $(srcdir)/dist/yasm.sh $< $@
        rm -f $@
        mv `basename $@` $@

执行yasm调用的支持shell脚本:

#! /bin/sh

# Libtool support for yasm files, expect the first argument to be a path to
# the source file and the second argument to be a path to libtool's .lo file.
# Use the second argument plus libtool's -o argument to set the real target
# file name.
source=$1
target=`dirname $2`
while test $# -gt 0
do
        case $1 in
        -o)
                target="$target/$2"
                shift; shift;;
        *)
                shift;;
        esac
done

yasm -f x64 -f elf64 -X gnu -g dwarf2 -D LINUX -o $target $source