2012-05-10 2 views
15
  1. Как я могу бросить динамическую зависимость от libgmp и перейти от этого:Статическая ссылка GMP к приложению Haskell с использованием GHC (+ LLVM)

    linux-vdso.so.1 => (0x00007fffdccb1000) 
    libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fb01afc1000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000) 
    

    к этому (в настоящее время по желанию):

    linux-vdso.so.1 => (0x00007fffdccb1000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb01acc7000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb01aabe000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb01a8ba000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb01a69d000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb01a2df000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007fb01b249000) 
    

    в чистом и портативном режиме, который работает только во всех дистрибутивах GNU/Linux (и не вмешивается в BSD (включая OS X))?

  2. Вы видите какие-либо другие зависимости, которые могут вызвать проблемы в текущем списке, как указано выше, при распространении одного бинарного набора Haskell с несколькими дистрибутивами GNU/Linux?


Примечания:

+0

Каков ваш процесс развертывания? В частности, что мешает вам развертывать libgmp вместе с вашим приложением? Что вы имеете в виду, не испортить BSD, включая OSX? Вы не можете запускать один и тот же двоичный файл как на OSX, так и на Linux. – asm

+0

@AndrewMyers Я использую Cabal для сборки. Развернуть libgmp? Как? Я хочу поддерживать как минимум Windows, Linux, OS X и FreeBSD. Если мне нужно создать общую/динамическую библиотечную версию libgmp для каждой платформы, чтобы развернуть ее вместе с моим приложением, это слишком много. Не возиться: решение, которое работает предпочтительно не только на одной ОС; думал о том, что кто-то может предложить использовать что-то вроде 'locate libgmp' и использовать все, что он может вернуть во время ссылки, и' locate' вести себя по-разному на разных ОС. (Замените 'locate' каким-либо другим инструментом здесь, как вы пожелаете.) –

+0

Похоже, вы говорите о развертывании двоичного файла, который вам придется создавать для каждой платформы. Так как вы должны построить его для каждой платформы, у вас должна быть версия libgmp для каждой платформы, так что вы можете просто упаковать ее с помощью своего двоичного файла. Мне что-то не хватает о том, как вы планируете распространять свое приложение? – asm

ответ

15

Если вы передадите -optl-static -optl-pthread в GHC, он будет статически связывать все зависимости библиотеки времени выполнения, включая GMP. Установка ld-options: -static -pthread в вашем файле Cabal должна выполнить то же самое.

Это означает, что вы также статически ссылаетесь на glibc, но это, вероятно, не будет проблемой, хотя это может немного увеличить двоичный размер. Использование альтернативного libc как musl или uClibc должно помочь противодействовать этому, если это проблема для вас.

+2

Зачем нужен '-pthread'? –

+1

Я не уверен. В последний раз, когда я статически связывал программу с GHC, у меня были ошибки, связанные с символами pthread, если я не передал их. Возможно, это уже не понадобится. – ehird

+0

Я просто связал приложение как можно более статически. ** Windows ** и ** OS X **: 'libgmp' статически компилируется. ** Linux **: '-статический' для' ghc' и 'ld' достаточно без' -pthread'; 'libc' статически связан, но предупреждает о динамической загрузке, используемой внутри' libc'. ** FreeBSD **: всегда жалуется на символы 'pthread', использую ли я' -pthread' или нет. –

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