Code: Alles auswählen
library library1;
{$mode objfpc}{$H+}
uses
cthreads;
procedure test (var result: integer); stdcall;
begin
result:=42;
end;
exports
test;
begin
end.
Code: Alles auswählen
program project1;
uses
cthreads,
classes,
dynlibs;
type
ttestproc = procedure (var result: integer); stdcall;
tmythread = class(tthread)
procedure execute; override;
protected
h: tlibhandle;
f: ttestproc;
end;
procedure tmythread.execute;
var i: integer;
begin
h := loadlibrary ('./liblibrary1.so');
f := ttestproc (getprocedureaddress (h, 'test'));
f(i);
unloadlibrary(h);
end;
var
t: tmythread;
h1: tlibhandle;
begin
h1 := loadlibrary ('./liblibrary1.so');
t := tmythread.create(true);
t.start;
t.waitfor;
unloadlibrary (h1);
end.
Das ganze funktioniert unter Win32 und Linux64 ohne Probleme. Aber auf Linux32 ergibt sich ein Stack Overflow Error 202, sofern beim Compilieren der Library die Option "Stack Overflow Checking" aktiviert war. Der Stack Overflow passiert beim Aufruf der Library-Funktion in Zeile 22 des Hauptprogramms. Er tritt nur dann auf, wenn
a) Die Bibliothek schon zuvor geladen wurde (Zeile 31), d.h. das Handle nicht erstmalig angefordert wird, und
b) der Aufruf innerhalb eines Threads erfolgt. Ruft man nur den Code des Threads auf (ohne einen Thread zu starten), funktioniert alles normal.
Ich frage mich nun, ob es sich bei dem Verhalten um einen Compiler-Bug handelt, oder ob ich einen dummen Fehler in der Programmierung habe.
Die Tests mit dem oben gelisteten Beispiel erfolgten auf Ubuntu 15.10, Lazarus 1.4, FPC 2.6.4.