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

Posted

技术标签:

【中文标题】无法使 libtool 合并 yasm 创建的目标文件【英文标题】:Unable to make libtool incorporate yasm-created object files 【发布时间】:2016-09-09 14:15:35 【问题描述】:

我正在努力让libtoolyasm 一起工作。

yasm 从我的.asm 源创建正确的.o files,但我不知道如何获取libtool 来构建关联的.lo.dep 文件。 它想构建共享库,合并.o 文件。

【问题讨论】:

【参考方案1】:

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

您可以使用 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 中的制表符,而不是 (8) 个空格字符! 您可能还需要在此之前添加:.SUFFIXES: .asm .lo。我使用变量$(LIBTOOL),因为某些平台(例如OSX)需要将其安装为glibtool,这就是Makefile.in所做的。

例如,生成的src.losrc.o.libs/src.o 应该被make clean 尊重。

对于您的库libfoo,您需要通过EXTRA_libfoo_la_SOURCES = src.asm 让automake 了解这些来源,并通过libfoo_la_LIBADD = src.lo 告知obj deps。甚至可能值得添加到依赖项:libfoo_la_DEPENDENCIES = src.lo

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

【讨论】:

这几乎也是我最终的结果,并且存在问题:首先,.asm.lo 命令仅由 libtool 运行一次(我使用的是shell 脚本作为 yasm 底层的前端,该 shell 脚本只执行一次以响应命令“make XXX.lo”);其次,XXX.lo 文件是在顶层 Makefile 目录中创建的,而不是在源目录中。我可以更改我的 shell 脚本以在一次执行中同时创建 .libs/XXX.oXXX.o,并且我可以移动 XXX.lo 文件,但这样做似乎很脆弱(在不构建共享库时是错误的)。 编辑:我已经弄清楚我在创建静态和共享对象时出错的地方,我的脚本错误。是否有 libtool 创建 XXX.lo 文件的方法?【参考方案2】:

这行得通(虽然我从来没有弄清楚如何让 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

【讨论】:

以上是关于无法使 libtool 合并 yasm 创建的目标文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 libtool 和 autoconf 构建 ASM 代码

Libtool 为对象添加前缀,但 gcov 要求它们不带前缀

使用ar或libtool创建静态存档在越狱iOS上失败

libtoolize:错误:无法列出文件

调试用 yasm 创建的汇编代码

如何在Windows 10上安装YASM?