Я понял почему не работает dll'ка у меня - это ошибка компилятора (я юзаю довольно старый 2.0.4).
- Код: Выделить всё
- .globl   P$TESTEX_GET_PLUGIN_INFO_EX$TIBEINTERFACEEX$POINTER
 P$TESTEX_GET_PLUGIN_INFO_EX$TIBEINTERFACEEX$POINTER:
 # Temps allocated between ebp-8024 and ebp+0
 pushl   %ebp
 movl   %esp,%ebp
 subl   $8020,%esp
 movl   %eax,3928(%esp)
 pushl   %eax
 movl   %ebx,-8024(%ebp)
 movl   %esi,-8020(%ebp)
 movl   %edi,-8016(%ebp)
 # Var Intf located at ebp+8
 # Var PluginInfo located at ebp+12
 # здесь копируется параметр Intf.
 movl   8(%ebp),%esi
 leal   -8008(%ebp),%edi
 cld
 movl   $2002,%ecx
 rep
 movsl
 
вместо movl 8(%ebp),%esi должно стоять leal 8(%ebp),%esi. В результате этой ошибки в esi оказывается ноль (первое поле структуры TIBEInterfaceEx), а не указатель на структуру в стеке и происходит исключение при копировании параметра Intf. Так что нужно найти версию компилятора, в которой на этом месте будет стоять leal. Кроме этого, могут возникнуть проблемы с разным выравниванием структур в fpc/delphi. И не следует забывать о директиве {$MODE} - без нее integer двухбайтный.
Если у вас в дизасме стоит leal, то выложите куда-нибудь скомпиленную dll'ку вместе с ассемблерным листингом (семейство опций -a). 
PS Это ошибка прошла не замеченной скорее всего потому, что никто 8Kb структуры копированием не передает - но поправлять IBExpert похоже уже поздно.