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
を渡すことで実行バイナリを生成することはできるが、不便なことこの上ない。