После отката на fpc2.0.0 и Lazarus 0.9.12 вариант с ExGetStr:=@GetStr заработал нормально  

 . 
Но теперь я зашол в полный тупик 

 . 
 Стринги нельзя передавать из dll в ехе или что там в линуксе. переменная типа string - динамический массив, должен убиваться или изменяться в томже модуле где создан. 
Ну хорошо поставлю я string[256]; не в этом дело.
 Чето ты какието сложности наводишь на пустом месте скажи конкретно что ты хочешь получить?  
Я хотел чтоб библеотека, когда ей понадобится, вызываля функцию в программе с запросом нужной строки. 
Примерно...
- Код: Выделить всё
 library test;
type PGetStr = function (indx: integer): string;
var GetStr: PGetStr; export;
procedure test; cdecl;
var i: integer;
begin
   for i:= 1 to 22 do writeln(GetStr(i));
end;
exports test;
end.
//-------------------------------
program testing;
uses Classes;
interface
type 
 PGetStr = function (indx: integer): string;
var 
 ExGetStr: PGetStr; external name 'GetStr';
 FileWithStrings: TStringList;
implementation
function GetStr(indx: integer): string;
begin
  result:=FileWithString.Strings[indx];
end;
begin
  FileWithStrings:=TStringLisr.Create;
  FileWithStrings.LoadFromFile('testing.pas');
  ExGetStr:=@GetStr;
  test;
  FileWithStrings.Free;
end.
Всё так хорошо было, а теперь оказалось что вызываемая библеотекой функция GetStr в программе выполняется в контексте библеотеки и о FileWithStrings обьекте ничего не знает 

 . После долгих раздумий (~2часа) и поиска в гугле (~3 часа) я понял что если неполучится менять контекст на программный при вызове, то придётся переробатывать много строчек кода в библеотеке и менять логику многих функций  <_< , а это очень плохо.
PS Вот-так меня кинул этот fp  <_< 
PSS Кстати откапал какойто термин - "callback", он может отнасится к моей проблеме?