2016-09-09 9 views
2

私はlibtoolyasmを連携させようとしています。libtoolにyasmで作成されたオブジェクトファイルを組み込むことができません

yasmは私の.asmソースから正しい.o filesを作成しますが、私は、関連する.lo.depファイルを構築するためにlibtoolを取得する方法を見つけ出すことはできません。 .oファイルを組み込んだ共有ライブラリを構築したいと考えています。

答えて

0

libtool生成されるファイルは、通常、次のレイアウトを使用します。ファイルは、buildディレクトリのロケーションメタデータで構成されます。静的オブジェクト.obuildディレクトリにあります。 build/.libsディレクトリにあるPIC /共有の.oオブジェクトです。

libtoolコンパイルモードを使用できます。私はヤスムに慣れていないので、スイッチを記入する必要があります。 yasmビルドは2回実行され、1回は-DPIC(およびその他の共有オブジェクトオプション)で実行されます。

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

automakeにを使用している場合、これは.asmファイルの明示的なルールが必要な場合があります。

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

は(8)空白文字、それらは、メイクファイル内のタブであることを念頭に置いていないしてください! この前に追加する必要があります:.SUFFIXES: .asm .lo。私は$(LIBTOOL)という変数を使用していますが、プラットフォーム(OSXなど)によってはglibtoolとしてインストールする必要がありますが、それはMakefile.inです。

生成されたsrc.lo,src.o,.libs/src.oは、例えばmake cleanであるとみなされます。

ライブラリlibfooの場合、automakeにEXTRA_libfoo_la_SOURCES = src.asm、obj depsをlibfoo_la_LIBADD = src.loと指定して、これらのソースについて知る必要があります。依存関係を追加する価値があるかもしれません:libfoo_la_DEPENDENCIES = src.lo

src.asmlibfoo_la_SOURCESに入れるだけでは不十分ですが、なぜわかりませんが

+0

はこれはかなりある、との問題があります:最初、_ .asm.lo_コマンドはlibtoolによって一度だけ実行されます(シェルスクリプトをyasmのフロントエンドとして使用しています。そのシェルスクリプトは "make XXX.lo"コマンドに応答して一度だけ実行されます)。 _XXX.lo_ファイルは、ソースディレクトリではなく最上位のMakefileディレクトリに作成されます。シェルスクリプトを変更して、_.libs/XXX.o_と_XXX.o_の両方を1回の実行で作成し、_XXXを移動することができました。lo_ファイルを明示的に使用していますが、これは壊れやすいようです(共有ライブラリを作成しない場合は間違っています)。 –

+0

編集:私は静的オブジェクトと共有オブジェクトの両方を作成する際に私が間違っている箇所を見つけました。スクリプトのエラーです。 libtoolが_XXX.lo_ファイルを作成するレシピはありますか? –

0

これはうまくいきます(ただし、ターゲットディレクトリに.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 [email protected]`; test $d/.libs || mkdir $d/.libs 
     $(LIBTOOL) --tag=CC --mode=compile sh $(srcdir)/dist/yasm.sh $< [email protected] 
     rm -f [email protected] 
     mv `basename [email protected]` [email protected] 

yasm通話を行うにサポートシェルスクリプト:私はあまりにも終わったところ

#! /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 
関連する問題