2015-02-02 3 views
2

Мне интересно, почему некоторые символы сложения не имеют соответствующих символов _info._closure и _info символы в динамических библиотеках ghc

На OSX я установил GHC-7.8.3 с помощью https://ghcformacosx.github.io/

Если я бегу:

nm -gU /Applications/ghc-7.8.3.app/Contents/lib/ghc-7.8.3/bin/../directory-1.2.1.0/libHSdirectory-1.2.1.0-ghc7.8.3.dylib | grep findExecut 

Я получаю следующий вывод:

0000000000010348 D _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable1_closure 
000000000000a3a8 T _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable1_info 
000000000000fe90 D _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable2_closure 
000000000000fe78 D _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable3_closure 
000000000000fe58 D _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable4_closure 
00000000000046c8 T _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable4_info 
00000000000105a8 D _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable_closure 
000000000000d6f0 T _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutable_info 
0000000000010338 D _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutablezuzdsa_closure 
000000000000a030 T _directoryzm1zi2zi1zi0_SystemziDirectory_findExecutablezuzdsa_info 

Обратите внимание, что не все из Символы привязки имеют соответствующие символы _info.

У меня возникла ситуация, когда tar-0.4.1.0 ссылается на символ findExecutable3_info, а ссылка не работает, потому что она не найдена. Но сначала я хотел бы понять, почему и wherefores символов _info.

ответ

2

Смотрите эту схему закрытия от https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/HeapObjects:

layout of a closure

Каждого обыкновенного («коробка») значение Haskell представлено в памяти объект называется замыканием. Первое слово замыкания называется «указателем информации» и определяет, какое значение оно имеет, а остальная часть замыкания содержит данные, которые определяют конкретное значение (например, поля ADT). Большинство замыканий динамически выделяются в куче, но скомпилированная программа Haskell также может содержать так называемые статические замыкания в своих разделах данных. Символы _closure - это эти замыкания, которые находятся внутри объектного файла, а символы _info - это указатели на конец информационных таблиц и начало кода ввода.

Например, если ваша программа содержит источник

x :: Integer 
x = 123 

, то он будет скомпилирован в ядро ​​

x :: Integer 
x = S# 123#  -- S# is the "small integer" constructor for Integer, 
       -- and 123# is an unboxed Int# literal 

и в объектном файле будет символ с именем, как x_closure который имеет два слова, первое слово которого указывает на S#_info (через перемещение ELF), вторым словом которого является значение 123. В этом случае нет необходимости в x_info, поскольку x является S#.

Для функции f, GHC будет генерировать одновременно f_info, который может быть вызван непосредственно, когда f используется в контексте, в котором она поставляется достаточно аргументов, и f_closure с информационным указателем f_info, который может быть использован в противном случае (например, если f используется в качестве аргумента для функции более высокого порядка). См. https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/HeapObjects#FunctionClosures.

Что касается ошибки компоновщика, возможно, у вас есть файлы интерфейса, которые не синхронизированы с соответствующими объектными файлами. Нет никакого особого значения для имени findExecutable3, это просто некоторое вспомогательное определение, которое было поднято до верхнего уровня при компиляции findExecutable. Я бы предположил, что где-то в файле интерфейса для System.Directory (или модуль, который зависит от него) у вас есть некоторое разворачивание, которое ссылается на функцию findExecutable3, но когда System.Directory был скомпилирован, findExecutable3 фактически оказался чем-то другим.

Смежные вопросы