kubo39's blog

ただの雑記です。

月曜日のはわわっ・・!

Sierra

会社のMBPをSierraにあげた。MacOSXはOSのアップデートのような操作もApple IDを要求、すなはち住所などの入力を要求してくる邪悪なOSであり早急に滅ぶべきだ。

PIEとD言語

Ubuntu16.10にあげて以降dmd/ldcともにこのようなエラーが

$ LANG=C dmd hello.d
/usr/bin/ld: hello.o: relocation R_X86_64_32 against symbol `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /home/kubo39/.anyenv/envs/denv/versions/dmd-2.071.1/linux/bin64/../lib64/libphobos2.a(exception_223_55a.o): relocation R_X86_64_32 against symbol `__dmd_personality_v0' can not be used when making a s
hared object; recompile with -fPIC

fPICつきでも

$ LANG=C dmd -fPIC hello.d
/usr/bin/ld: /home/kubo39/.anyenv/envs/denv/versions/dmd-2.071.1/linux/bin64/../lib64/libphobos2.a(exception_223_55a.o): relocation R_X86_64_32 against symbol `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC

それぞれのバージョンは以下。

( ՞ਊ ՞) :~/dev/dlang $ dmd --version
DMD64 D Compiler v2.071.2
Copyright (c) 1999-2015 by Digital Mars written by Walter Bright
( ՞ਊ ՞) :~/dev/dlang $ ldc2 -version | head -1
LDC - the LLVM D compiler (1.0.0):

これはGCC toolchainがアップデートされ、GCCのデフォルトオプションが変更されたためである。

ldcの場合は -relocation-model=pic をつければ問題なく動く。

 $ ldc2 -relocation-model=pic hello.d
 $ ./hello
Hello

あるいは

$ ldmd2 -fPIC -run hello.d
Hello

ldcは1.1.0でPICがデフォルトとなる https://github.com/ldc-developers/ldc/pull/1664

dmdのほうはだめ。

$ LANG=C dmd -fPIC hello.d 2>&1 > /dev/null | head -1
/usr/bin/ld: /home/kubo39/.anyenv/envs/denv/versions/dmd-2.071.1/linux/bin64/../lib64/libphobos2.a(exception_223_55a.o): relocation R_X86_64_32 against symbol `__dmd_personality_v0' can not be used when making a shared object; recompile with -fPIC

どうやらdmdの-fPICオプションに問題があるようだ。

とりあえずオブジェクトファイルの生成までにとどめておいてgccでリンク処理をするときに -no-pie を渡すことで実行バイナリを生成することはできるが、不便なことこの上ない。