Как я могу найти DynaLoader сопоставление имен модулей с непрозрачными указателями? - PullRequest
2 голосов
/ 13 июня 2019

Согласно документации на DynaLoader

dl_unload_file() Динамическая выгрузка $libref, которая должна быть непрозрачной «библиотечной ссылкой» , возвращаемой из dl_load_file. Возвращает единицу в случае успеха и ноль в случае неудачи. Эта функция является необязательной и может не обязательно предоставляться на всех платформах.

Итак, dl_load_file возвращает непрозрачную ссылку. Но что, если мой файл не был загружен явным вызовом dl_unload_file, как мне тогда найти эти ссылки?

1 Ответ

2 голосов
/ 13 июня 2019

Вы можете найти эти ссылки, используя следующие переменные , как описано в источнике

@dl_shared_objects  = ();       # shared objects for symbols we have 
@dl_librefs         = ();       # things we have loaded
@dl_modules         = ();       # Modules we have loaded

Однако сопоставление их с именем библиотеки остается упражнением для пользователяхотя кажется, что они чувствительны к индексу в этих трех массивах.Вы можете сделать это так,

my %db;
foreach my $i ( 0 .. $#DynaLoader::dl_librefs ) {
  $db{$DynaLoader::dl_modules[$i]} = {
    dl_shared_objects => $DynaLoader::dl_shared_objects[$i],
    dl_librefs        => $DynaLoader::dl_librefs[$i],
    dl_modules        => $DynaLoader::dl_modules[$i]
  };
}
...