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: | 399 |
Nodes: | 16 (2 / 14) |
Uptime: | 65:16:31 |
Calls: | 8,355 |
Calls today: | 15 |
Files: | 13,159 |
Messages: | 5,893,953 |
Posted today: | 1 |