Linux の C プログラムから使用したい Free Pascal ユニットが 2 つあります。
これが私がすることです:
$ fpc -fPIC base64.pas queueutils.pas
Warning: Only one source file supported
Free Pascal Compiler version 2.2.2 [2008/11/05] for x86_64
Copyright (c) 1993-2008 by Florian Klaempfl
Target OS: Linux for x86-64
Compiling queueutils.pas
queueutils.pas(2088,11) Warning: Symbol "Socket" is deprecated
queueutils.pas(2097,10) Warning: Symbol "Connect" is deprecated
queueutils.pas(2104,3) Warning: Symbol "Sock2Text" is deprecated
2432 lines compiled, 0.5 sec
4 warning(s) issued
$ ppumove -o queueutils -e ppl *.ppu
PPU-Mover Version 2.1.1
Copyright (c) 1998-2007 by the Free Pascal Development Team
Processing base64.ppu... Done.
Processing queueutils.ppu... Done.
Linking queueutils.o base64.o
Done.
libqueueutils.so が作成されます。
$ file libqueueutils.so
libqueueutils.so: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), not stripped
$ ldd libqueueutils.so
ldd: warning: you do not have execution permission for `./libqueueutils.so'
statically linked
ただし、C プログラムがこの方法でライブラリを使用しようとすると、次のようになります。
libqueue = dlopen("./libqueueutils.so", RTLD_LAZY);
if (!libqueue) {
fprintf (stderr, "%s\n", dlerror());
}
エラーメッセージが表示されます:
$ ./tmbrkr
./libqueueutils.so: undefined symbol: VMT_PROCESS_TPROCESS
この VMT_PROCESS_TPROCESS 関連のエラーは、ppumove によるリンク処理に process.o と process.ppu を追加すると解決します。しかし、そうすると別のユニットが欠落し、その後別のユニットが欠落しています...わかりました。
Cプログラムがライブラリを適切にdlopen()できるように、必要なすべてのユニットを1つの.soファイルにリンクする方法はありますか?