2014-12-05 4 views
7

Ich beobachte ein anderes Verknüpfungsverhalten zwischen zwei Rechnern beim Kompilieren einer Binärdatei. Was bestimmt das Verknüpfungsverhalten für GHC unter OS X?

Jeder hat die gleiche GHC (7.8.3), denselben Code, gleichen Flags (-Wall -O2), gleichen libgmp (von Homebrew auf jedem installiert ist):

machine-one$ otool -L my-binary 
my-binary: 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
     /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) 

machine-two$ otool -L my-binary 
my-binary: 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 
     /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0) 
     /usr/local/lib/libgmp.10.dylib (compatibility version 13.0.0, current version 13.0.0) 

kann ich nicht für das Leben von mir herauszufinden, warum libgmp dynamisch auf der zweiten Maschine verbunden ist.

In Bezug auf Unterschiede konnte ich erkennen: GHC wurde über die binary distribution for OS X auf der ersten Maschine und Homebrew auf der zweiten installiert. Für C-Compiler, die wir haben:

machine-one$ cc --version 
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin13.4.0 
Thread model: posix 

machine-two$ cc --version 
Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) 
Target: x86_64-apple-darwin13.4.0 
Thread model: posix 

Was typischerweise das Vererbungsverhalten bestimmt, und wie kann ich ein Verknüpfungsverfahren oder das andere durchzusetzen?

EDIT: Ich habe das gleiche Verhalten mit zlib auf einer anderen Maschine passiert, so ist es kein GMP-spezifisches Problem.

EDIT: Ich habe ghc --info von jeder der Maschinen gerupft, hier sind sie für machine one und machine two. Und hier ist auch the diff zwischen den beiden.

EDIT: Ich habe ghc auf Maschine zwei über die Verteilung binären neu installiert, und sicher genug libgmp ist nicht dynamisch gelinkt, wenn ich meine binären neu kompilieren. Es scheint also, dass dies mit der Installation von GHC über Homebrew zusammenhängt.

Noch ziemlich interessiert, was genau los ist.

+0

Ich denke, es könnte teilweise davon abhängen, wie GHC kompiliert wurde. Könnten die beiden verwendeten Distributionen anders kompiliert sein? – dfeuer

+0

Eine ähnliche Frage: [(link)] (http://stackoverflow.com/questions/10539857/statical-link-gmp-to-an-haskell-application-using-ghc-llvm), die helfen könnte. – ErikR

+0

@dfeuer GHC wurde zwar anders installiert - über eine binäre vs via Homebrew - aber ich kann in beiden Fällen keine Informationen darüber finden, was dort zu erwarten ist. @ user5402 Ich verstehe, dass man die statischen Linking-Flags auf OS X nicht übergeben kann, da es keine Möglichkeit gibt, 'libSystem' und' libiconv' statisch zu verknüpfen. – jtobin

Antwort

1

Der entscheidende Unterschied ist, dass Maschine # 2 hat /usr/local/lib in den Linker-Pfad, und verwendet brew Linker (/usr/local/Library/ENV/4.3/ld). ghc verwendet immer noch einen externen Linker, auch wenn das C-Backend nicht für die Codegenerierung verwendet wird. Daher können Sie Haskell-Code mit in anderen Sprachen geschriebenem Code kombinieren (entscheidend für die vielen FFI-Bindungen von Haskell zu Bibliotheken von Drittanbietern). Du solltest also die Brauer wirklich fragen, warum die Dinge anders miteinander verknüpft werden. Es ist nicht wirklich ein ghc Problem.