For the plugin scheme in my actual program I worked along the
corresponding gnat example, but while the original works, mine doesn't.
So I boiled it down to a minimum.
plugin.ads
----------
package Plugin is
procedure Empty;
end Plugin;
plugin.adb
----------
with Ada.Finalization;
with Ada.Text_IO;
package body Plugin is
type Life_Controller is new Ada.Finalization.Limited_Controlled with null record;
overriding procedure Initialize (lc: in out Life_Controller);
overriding procedure Finalize (lc: in out Life_Controller);
procedure Empty is
begin
null;
end Empty;
overriding procedure Initialize (lc: in out Life_Controller) is
begin
Ada.Text_IO.Put_Line("Hello world!");
end Initialize;
overriding procedure Finalize (lc: in out Life_Controller) is
begin
Ada.Text_IO.Put_Line("Bye world!");
end Finalize;
lc: Life_Controller;
end Plugin;
main.adb
--------
with System;
with Interfaces.C.Strings;
with Ada.Text_IO;
procedure Main is
use type System.Address;
RTLD_LAZY: constant := 1;
handle: System.Address;
function dlopen (Lib_Name: String; Mode: Interfaces.C.int)
return System.Address;
pragma Import (C, dlopen, "dlopen");
begin
handle:= dlopen ("../Plugin/lib/libplugin.so" & ASCII.NUL, RTLD_LAZY);
if handle = System.Null_Address then
Ada.Text_IO.Put_Line("unable to load plugin");
end if;
end Main;
Main executes without any output. My understanding is the following:
- When plugin loading with dlopen fails, I get an error message.
- Otherwise, the controlled variable lc in plugin.adb comes to life and
I get an output from the Initialize procedure.
Where is my misconception?
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 405 |
Nodes: | 16 (2 / 14) |
Uptime: | 56:39:35 |
Calls: | 8,500 |
Calls today: | 1 |
Files: | 13,203 |
Messages: | 5,917,425 |