libtool
과 yasm
을 함께 사용하려고합니다.libtool이 yasm이 만든 객체 파일을 통합 할 수 없습니다.
yasm
내 .asm
소스에서 올바른 .o files
작성하지만 나는 libtool
연관된 .lo
및 .dep
파일을 구축하는 얻는 방법을 알아낼 수 없습니다. .o
파일을 통합하여 공유 라이브러리를 작성하려고합니다.
libtool
과 yasm
을 함께 사용하려고합니다.libtool이 yasm이 만든 객체 파일을 통합 할 수 없습니다.
yasm
내 .asm
소스에서 올바른 .o files
작성하지만 나는 libtool
연관된 .lo
및 .dep
파일을 구축하는 얻는 방법을 알아낼 수 없습니다. .o
파일을 통합하여 공유 라이브러리를 작성하려고합니다.
libtool
생성 된 파일은 일반적으로 다음 레이아웃을 사용합니다. .lo
build
디렉토리의 위치 메타 데이터로 구성된 파일. 정적 객체 .o
은 build
디렉토리에 있습니다. 및 디렉토리의 PIC/shared .o
개체가 있습니다.
libtool 컴파일 모드를 사용할 수 있습니다. 나는 yasm에 익숙하지 않으므로 스위치를 채워야 할 것입니다. yasm
빌드를 두 번 실행하고 -DPIC
(다른 공유 객체 옵션 일 수도 있음)으로 한 번 실행합니다.
.asm.lo:
$(LIBTOOL) --tag=CC --mode=compile \
yasm <options> $<
사람들은 메이크에서 탭,하지 (8) 공백 문자 있음을 알아 두셔야합니다 :
libtool --tag=CC --mode=compile yasm <options> src.asm
automake에를 사용하는 경우, 이것은 .asm
파일에 대한 명시 적 규정이 필요할 수 있습니다! 또한이 전에 .SUFFIXES: .asm .lo
을 추가해야 할 수도 있습니다. 일부 플랫폼 (예 : OSX)이 glibtool
으로 설치해야하고 $(LIBTOOL)
이라는 변수를 사용합니다. 이는 Makefile.in
입니다.
생성 된 src.lo
, src.o
, .libs/src.o
은 예를 들어 make clean
으로 간주되어야합니다.
라이브러리 libfoo
의 경우 automake가 EXTRA_libfoo_la_SOURCES = src.asm
및 libfoo_la_LIBADD = src.lo
인 obj deps로이 소스에 대해 알릴 필요가 있습니다. 의존성을 추가하는 것이 유용 할 수도 있습니다 : libfoo_la_DEPENDENCIES = src.lo
.
src.asm
을 libfoo_la_SOURCES
에 넣는 것만으로는 충분하지 않습니다.
libtool에서 대상 디렉토리에 .lo
파일을 만들거나 대상 디렉토리의 .libs
디렉토리를 만드는 방법을 알지 못했지만이 방법이 유용합니다.
Makefile을 규칙 : 꽤 많이 나는 너무 결국 어디
#! /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
이이며, 문제가 :
지원 쉘 스크립트는 yasm 통화를 할 수 먼저 _ .asm.lo_ 명령은 libtool에 의해 한 번만 실행됩니다 (yasm의 프론트 엔드로 쉘 스크립트를 사용하고 있습니다. 쉘 스크립트는 "make XXX.lo"명령에 대한 응답으로 한 번만 실행됩니다). 두 번째로, _XXX.lo_ 파일은 소스 디렉토리가 아닌 최상위 Makefile 디렉토리에 작성됩니다. 한 번에 _.libs/XXX.o_와 _XXX.o_를 만들기 위해 쉘 스크립트를 바꿀 수 있었고 _XXX를 옮길 수있었습니다.lo_ 파일을 명시 적으로 만들었지 만 그렇게하는 것은 허약합니다 (공유 라이브러리를 만들지 않을 때는 잘못되었습니다). –
편집 : 정적 객체와 공유 객체를 만들 때 어디서 잘못되었는지 알아 냈습니다. 스크립트 오류입니다. libtool이 _XXX.lo_ 파일을 생성하는 방법이 있습니까? –