2008-10-24

透過的なLLVM (9)

SUSv3はarのx命令を規定しており、llvm-arもx命令を提供する。アーカイブファイルからオブジェクトファイルを抽出するという機能は共通だが、共通の動作は期待できないかもしれない。llvm-arはfモディファイヤを与えない限り、オブジェクトファイルの完全パスをアーカイブファイルに保存する。x命令は、保存された完全パスにオブジェクトファイルを書き出そうとする。ディレクトリが存在していない場合、抽出は失敗する。

Lame 3.98.2はビルドにx命令を使用する。libmpgdecoder.aとliblamevectorroutines.aからオブジェクトファイルを抽出して、libmp3lame/.libs/libmp3lame.0.0.0.{a,dylib}にまとめる(実際の仕事はlibtoolシェルスクリプトが行う)。

$ llvm-ar tv mpglib/.libs/libmpgdecoder.a
brw-r--r--  501/  20     6508 Oct 23 09:23:37 2008 .libs/common.o
brw-r--r--  501/  20     8116 Oct 23 09:23:38 2008 .libs/dct64_i386.o
brw-r--r--  501/  20    15224 Oct 23 09:23:39 2008 .libs/decode_i386.o
brw-r--r--  501/  20    18900 Oct 23 09:23:40 2008 .libs/interface.o
brw-r--r--  501/  20     6344 Oct 23 09:23:40 2008 .libs/layer1.o
brw-r--r--  501/  20    12296 Oct 23 09:23:41 2008 .libs/layer2.o
brw-r--r--  501/  20    74804 Oct 23 09:23:43 2008 .libs/layer3.o
brw-r--r--  501/  20     5284 Oct 23 09:23:44 2008 .libs/tabinit.o
$ llvm-ar tv libmp3lame/vector/.libs/liblamevectorroutines.a
brw-r--r--  501/  20     1932 Oct 23 09:23:46 2008 .libs/xmm_quantize_sub.o

xmm_quantize_sub.oは18文字あるので、アーカイブファイルの作成時にfモディファイヤをつけて対処することはできない。簡単な解決策は美しくないハックだ。x命令の実行前にカレントディレクトリへのシンボリックリンクを作成する。

#! /bin/sh

set -e

case "$1" in
    *x*)
        for i in `llvm-ar tv "$2" | awk '{ printf " %s", $9 }'`; do
            ifs="$IFS"
            IFS="/"
            for d in `dirname "$i"`; do
                if [ -f "$d" ] || [ -d "$d" ] || [ -h "$d" ]; then
                    :
                else
                    ln "-s" "." "$d"
                fi
            done
            IFS="$ifs"
        done
        ;;
esac
llvm-ar "$@"

第一引数が命令とモディファイヤで、第二引数がアーカイブファイルであるならば、シェルスクリプトはほとんどの場合うまく働き、期待した動作を行う。嫌がらせみたいなオブジェクトファイルのパスを含む場合は、もちろん無理だけど。

0 件のコメント: