Kreténi. Tak jedině mohu nazvat autory OS X. Vysvětlím proč. Minule jsem popisoval jak staticky linkovat knihovny na OSX. V podstatě si musíte dát jen pozor, aby se při importu u symbolů přidalo podtržítko. Tj. pokud se exportovaná funkce jmenuje Foo, při importu musíte specifikovat název
_Foo
Ok, prostě taková úchylka, člověk se s tím smíří.
Nyní jsem potřeboval dynamicky zavádět knihovnu. OK, no problem - Delphi v SysUtils dává možnost použít knihovní funkce podobné jako jsou na Windows, tj.
LoadLibrary
GetProcAddress
FreeLibrary
které interně šikovně volají POSIX funkce dlopen, dlsym atd. Je to pěkné a v pohodě. Mimochodem, pokud to potřebujete pro Windows, tak navštivte povídání o LoadLibrary a GetProcAddress co jsem napsal dříve (funkce jsou v jednotce Windows).
Ale zpět. Takže statické linkování je s podtržítkem a funguje OK. Když jsem chtěl zkusit dynamické zavádění, tak se knihovna sice zavedla korektně, ale nefungovalo získání adresy. Přitom při použití nástroje nm, který je součástí instalace xcode (ale i normálního linuxu), to vypisovalo, že požadovaný symbol včetně podtržítka je dostupný.
Nezafungovalo ani přidání dalšího podtržítka, až jsem si pořádně přečetl man stránku pro dlsym a tam je nakonec uvedena malá noticka - že se předává jméno bez podtržítka. A pak to fungovalo. Takže pro statické linkování s a dynamicky bez.
Následně jsem narazil na popis stejného problému ohledně dlsym na OS X od Eli Bolinga (který, pokud to nevíte, je jeden z autorů Kylixu a OS X kompilátoru), který se tomu slušně řečeno podivoval. Určitě si to přečtěte - na linuxu se to chová trošku jinak - prostě chaos.
Jinak jsem byl překvapen, jak pěkně funguje uvedená podpora v RTL Delphi.