Trình nghe thời gian dài, người gọi lần đầu tiên. Tôi biết đây là một câu hỏi hơi mơ hồ và không mong đợi quá nhiều. :-)Đang tải các đối tượng được chia sẻ Ada trong Perl với DynaLoader.pm
tôi có các tập tin Ada sau:
greeter.ads
package Greeter is
procedure Hello;
end Greeter;
greeter.adb
with Ada.Text_IO; use Ada.Text_IO;
package body Greeter is
procedure Hello is
begin
Put_Line ("Hello, world!");
end Hello;
end Greeter;
Và biên dịch chúng thành một đối tượng chia sẻ như này:
gnatmake -z -fPIC greeter.adb
gcc -shared -o libgreeter.so greeter.o
Việc biên dịch này tốt. nm
cho thấy những biểu tượng sau:
$ nm -D libgreeter.so
w _Jv_RegisterClasses
0000000000201028 A __bss_start
w __cxa_finalize
w __gmon_start__
U __gnat_eh_personality
0000000000201028 A _edata
0000000000201038 A _end
00000000000006a8 T _fini
0000000000000520 T _init
U ada__text_io__put_line__2
0000000000201018 D greeter_E
000000000000063c T greeter__hello
Bây giờ tôi cố gắng để tải mà đối tượng được chia sẻ trong Perl:
#!/usr/bin/env perl
use 5.014;
use strict;
use warnings;
#BEGIN { $ENV{PERL_DL_DEBUG} = 1 };
package Greeter
{
use constant ADADIR => '/usr/lib/gcc/x86_64-linux-gnu/4.4/rts-native/adalib/';
use constant OURDIR => do { (my $f = __FILE__) =~ s{[^/]+$}//; $f || "." };
require DynaLoader;
our @ISA = 'DynaLoader';
my $runtime = DynaLoader::dl_load_file(
ADADIR.'/libgnat.so',
) or die DynaLoader::dl_error();
my $gep = DynaLoader::dl_find_symbol(
$runtime,
'__gnat_eh_personality',
) or die DynaLoader::dl_error();
my $libref = DynaLoader::dl_load_file(
OURDIR.'/libgreeter.so',
0x01,
) or die DynaLoader::dl_error();
my $func = DynaLoader::dl_find_symbol(
$libref,
'greeter__hello',
) or die DynaLoader::dl_error();
print $func, $/;
}
Nhưng với thông báo sau bom này:
./libgreeter.so : undefined symbol: __gnat_eh_personality tại ./greeter.pl dòng 26.
Có ai có gợi ý nào không? Có cái gì tốt hơn/dễ hơn DynaLoader mà tôi nên sử dụng không ??
Tôi có một kho lưu trữ với tất cả các file liên quan ở đây:
Simon Wright ++, điều này đã cho tôi một số công cụ tốt để bắt đầu với. Tôi sẽ thử điều đó và nếu nó hoạt động, sẽ chấp nhận câu trả lời này. – tobyink
Tôi chưa có tu để thử điều này, nhưng trong thời gian đó tôi đã chấp nhận câu trả lời vì có vẻ như nó hứa hẹn hơn cho cả hai. – tobyink