FreeBSD 10Rからiconvがlibcに含まれるようになりました。iconvはファイルシステムの処理でも利用するので、GPLなlibiconvではなくBSDライセンスなiconvを入れたようです。元々NetBSD方面にあったものの様で、日本の方も関わっていたものかもしれません。
main()
{
int res;
res = iconv_open("UTF-8", "UTF-16LE");
}
このコードは-liconvを付けなくてもコンパイルできます。
% ldd a.out
a.out:
libc.so.7 => /lib/libc.so.7 (0x80081f000)
個別の変換の処理はlibcの中には存在せずモジュールで別になっていて/usr/lib/i18nの下にあります。これらは直接リンクされているのではなく、このディレクトリにあるsoをdlopenで利用しています。
handle = libc_dlopen(p, RTLD_LAZY);
どのsoを読むかは
/usr/share/i18n/
の下のファイルを参照しています。
ちなみにpkgのlibiconvとの区別は/usr/local/includeにコピーされるiconv.hでiconv_openをlibiconv_openに変換するとで区別しているようです。
コンパイル時に"-I/usr/local/include -I/usr/include"にするとpkgのlibiconvが使われます。
configureでiconv_open()の関数チェックをヘッダーの読み込み無しに実行されると、必ずlibcの方が有効になってしまって、/usr/local/の方を使えない状態になってしまって困った事になることがありました。
buildworld時にMK_ICONV=noにするとlibcから外すことができるようです。