Improve runghc's argument handling
[ghc-hetmet.git] / rts / Linker.c
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 2000-2004
4  *
5  * RTS Object Linker
6  *
7  * ---------------------------------------------------------------------------*/
8
9 #if 0
10 #include "PosixSource.h"
11 #endif
12
13 /* Linux needs _GNU_SOURCE to get RTLD_DEFAULT from <dlfcn.h> and
14    MREMAP_MAYMOVE from <sys/mman.h>.
15  */
16 #ifdef __linux__
17 #define _GNU_SOURCE
18 #endif
19
20 #include "Rts.h"
21 #include "RtsFlags.h"
22 #include "HsFFI.h"
23 #include "Hash.h"
24 #include "Linker.h"
25 #include "LinkerInternals.h"
26 #include "RtsUtils.h"
27 #include "Schedule.h"
28 #include "Sparks.h"
29 #include "RtsTypeable.h"
30
31 #ifdef HAVE_SYS_TYPES_H
32 #include <sys/types.h>
33 #endif
34
35 #include <stdlib.h>
36 #include <string.h>
37
38 #ifdef HAVE_SYS_STAT_H
39 #include <sys/stat.h>
40 #endif
41
42 #if defined(HAVE_DLFCN_H)
43 #include <dlfcn.h>
44 #endif
45
46 #if defined(cygwin32_HOST_OS)
47 #ifdef HAVE_DIRENT_H
48 #include <dirent.h>
49 #endif
50
51 #ifdef HAVE_SYS_TIME_H
52 #include <sys/time.h>
53 #endif
54 #include <regex.h>
55 #include <sys/fcntl.h>
56 #include <sys/termios.h>
57 #include <sys/utime.h>
58 #include <sys/utsname.h>
59 #include <sys/wait.h>
60 #endif
61
62 #if defined(ia64_HOST_ARCH) || defined(openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS)
63 #define USE_MMAP
64 #include <fcntl.h>
65 #include <sys/mman.h>
66
67 #if defined(openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS)
68 #ifdef HAVE_UNISTD_H
69 #include <unistd.h>
70 #endif
71 #endif
72
73 #endif
74
75 #if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS)
76 #  define OBJFORMAT_ELF
77 #elif defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
78 #  define OBJFORMAT_PEi386
79 #  include <windows.h>
80 #  include <math.h>
81 #elif defined(darwin_HOST_OS)
82 #  define OBJFORMAT_MACHO
83 #  include <mach-o/loader.h>
84 #  include <mach-o/nlist.h>
85 #  include <mach-o/reloc.h>
86 #  include <mach-o/dyld.h>
87 #if defined(powerpc_HOST_ARCH)
88 #  include <mach-o/ppc/reloc.h>
89 #endif
90 #if defined(x86_64_HOST_ARCH)
91 #  include <mach-o/x86_64/reloc.h>
92 #endif
93 #endif
94
95 /* Hash table mapping symbol names to Symbol */
96 static /*Str*/HashTable *symhash;
97
98 /* Hash table mapping symbol names to StgStablePtr */
99 static /*Str*/HashTable *stablehash;
100
101 /* List of currently loaded objects */
102 ObjectCode *objects = NULL;     /* initially empty */
103
104 #if defined(OBJFORMAT_ELF)
105 static int ocVerifyImage_ELF    ( ObjectCode* oc );
106 static int ocGetNames_ELF       ( ObjectCode* oc );
107 static int ocResolve_ELF        ( ObjectCode* oc );
108 #if defined(powerpc_HOST_ARCH)
109 static int ocAllocateSymbolExtras_ELF ( ObjectCode* oc );
110 #endif
111 #elif defined(OBJFORMAT_PEi386)
112 static int ocVerifyImage_PEi386 ( ObjectCode* oc );
113 static int ocGetNames_PEi386    ( ObjectCode* oc );
114 static int ocResolve_PEi386     ( ObjectCode* oc );
115 #elif defined(OBJFORMAT_MACHO)
116 static int ocVerifyImage_MachO    ( ObjectCode* oc );
117 static int ocGetNames_MachO       ( ObjectCode* oc );
118 static int ocResolve_MachO        ( ObjectCode* oc );
119
120 static int machoGetMisalignment( FILE * );
121 #if defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH)
122 static int ocAllocateSymbolExtras_MachO ( ObjectCode* oc );
123 #endif
124 #ifdef powerpc_HOST_ARCH
125 static void machoInitSymbolsWithoutUnderscore( void );
126 #endif
127 #endif
128
129 #if defined(x86_64_HOST_ARCH) && defined(OBJFORMAT_ELF)
130 static void*x86_64_high_symbol( char *lbl, void *addr );
131 #endif
132
133 /* -----------------------------------------------------------------------------
134  * Built-in symbols from the RTS
135  */
136
137 typedef struct _RtsSymbolVal {
138     char   *lbl;
139     void   *addr;
140 } RtsSymbolVal;
141
142
143 #if !defined(PAR)
144 #define Maybe_Stable_Names      SymX(mkWeakzh_fast)                     \
145                                 SymX(makeStableNamezh_fast)             \
146                                 SymX(finalizzeWeakzh_fast)
147 #else
148 /* These are not available in GUM!!! -- HWL */
149 #define Maybe_Stable_Names
150 #endif
151
152 #if !defined (mingw32_HOST_OS)
153 #define RTS_POSIX_ONLY_SYMBOLS                  \
154       SymX(signal_handlers)                     \
155       SymX(stg_sig_install)                     \
156       Sym(nocldstop)
157 #endif
158
159 #if defined (cygwin32_HOST_OS)
160 #define RTS_MINGW_ONLY_SYMBOLS /**/
161 /* Don't have the ability to read import libs / archives, so
162  * we have to stupidly list a lot of what libcygwin.a
163  * exports; sigh.
164  */
165 #define RTS_CYGWIN_ONLY_SYMBOLS                 \
166       SymX(regfree)                             \
167       SymX(regexec)                             \
168       SymX(regerror)                            \
169       SymX(regcomp)                             \
170       SymX(__errno)                             \
171       SymX(access)                              \
172       SymX(chmod)                               \
173       SymX(chdir)                               \
174       SymX(close)                               \
175       SymX(creat)                               \
176       SymX(dup)                                 \
177       SymX(dup2)                                \
178       SymX(fstat)                               \
179       SymX(fcntl)                               \
180       SymX(getcwd)                              \
181       SymX(getenv)                              \
182       SymX(lseek)                               \
183       SymX(open)                                \
184       SymX(fpathconf)                           \
185       SymX(pathconf)                            \
186       SymX(stat)                                \
187       SymX(pow)                                 \
188       SymX(tanh)                                \
189       SymX(cosh)                                \
190       SymX(sinh)                                \
191       SymX(atan)                                \
192       SymX(acos)                                \
193       SymX(asin)                                \
194       SymX(tan)                                 \
195       SymX(cos)                                 \
196       SymX(sin)                                 \
197       SymX(exp)                                 \
198       SymX(log)                                 \
199       SymX(sqrt)                                \
200       SymX(localtime_r)                         \
201       SymX(gmtime_r)                            \
202       SymX(mktime)                              \
203       Sym(_imp___tzname)                        \
204       SymX(gettimeofday)                        \
205       SymX(timezone)                            \
206       SymX(tcgetattr)                           \
207       SymX(tcsetattr)                           \
208       SymX(memcpy)                              \
209       SymX(memmove)                             \
210       SymX(realloc)                             \
211       SymX(malloc)                              \
212       SymX(free)                                \
213       SymX(fork)                                \
214       SymX(lstat)                               \
215       SymX(isatty)                              \
216       SymX(mkdir)                               \
217       SymX(opendir)                             \
218       SymX(readdir)                             \
219       SymX(rewinddir)                           \
220       SymX(closedir)                            \
221       SymX(link)                                \
222       SymX(mkfifo)                              \
223       SymX(pipe)                                \
224       SymX(read)                                \
225       SymX(rename)                              \
226       SymX(rmdir)                               \
227       SymX(select)                              \
228       SymX(system)                              \
229       SymX(write)                               \
230       SymX(strcmp)                              \
231       SymX(strcpy)                              \
232       SymX(strncpy)                             \
233       SymX(strerror)                            \
234       SymX(sigaddset)                           \
235       SymX(sigemptyset)                         \
236       SymX(sigprocmask)                         \
237       SymX(umask)                               \
238       SymX(uname)                               \
239       SymX(unlink)                              \
240       SymX(utime)                               \
241       SymX(waitpid)
242
243 #elif !defined(mingw32_HOST_OS)
244 #define RTS_MINGW_ONLY_SYMBOLS /**/
245 #define RTS_CYGWIN_ONLY_SYMBOLS /**/
246 #else /* defined(mingw32_HOST_OS) */
247 #define RTS_POSIX_ONLY_SYMBOLS  /**/
248 #define RTS_CYGWIN_ONLY_SYMBOLS /**/
249
250 /* Extra syms gen'ed by mingw-2's gcc-3.2: */
251 #if __GNUC__>=3
252 #define RTS_MINGW_EXTRA_SYMS                    \
253       Sym(_imp____mb_cur_max)                   \
254       Sym(_imp___pctype)
255 #else
256 #define RTS_MINGW_EXTRA_SYMS
257 #endif
258
259 #if HAVE_GETTIMEOFDAY
260 #define RTS_MINGW_GETTIMEOFDAY_SYM Sym(gettimeofday)
261 #else
262 #define RTS_MINGW_GETTIMEOFDAY_SYM /**/
263 #endif
264
265 /* These are statically linked from the mingw libraries into the ghc
266    executable, so we have to employ this hack. */
267 #define RTS_MINGW_ONLY_SYMBOLS                  \
268       SymX(asyncReadzh_fast)                    \
269       SymX(asyncWritezh_fast)                   \
270       SymX(asyncDoProczh_fast)                  \
271       SymX(memset)                              \
272       SymX(inet_ntoa)                           \
273       SymX(inet_addr)                           \
274       SymX(htonl)                               \
275       SymX(recvfrom)                            \
276       SymX(listen)                              \
277       SymX(bind)                                \
278       SymX(shutdown)                            \
279       SymX(connect)                             \
280       SymX(htons)                               \
281       SymX(ntohs)                               \
282       SymX(getservbyname)                       \
283       SymX(getservbyport)                       \
284       SymX(getprotobynumber)                    \
285       SymX(getprotobyname)                      \
286       SymX(gethostbyname)                       \
287       SymX(gethostbyaddr)                       \
288       SymX(gethostname)                         \
289       SymX(strcpy)                              \
290       SymX(strncpy)                             \
291       SymX(abort)                               \
292       Sym(_alloca)                              \
293       Sym(isxdigit)                             \
294       Sym(isupper)                              \
295       Sym(ispunct)                              \
296       Sym(islower)                              \
297       Sym(isspace)                              \
298       Sym(isprint)                              \
299       Sym(isdigit)                              \
300       Sym(iscntrl)                              \
301       Sym(isalpha)                              \
302       Sym(isalnum)                              \
303       SymX(strcmp)                              \
304       SymX(memmove)                             \
305       SymX(realloc)                             \
306       SymX(malloc)                              \
307       SymX(pow)                                 \
308       SymX(tanh)                                \
309       SymX(cosh)                                \
310       SymX(sinh)                                \
311       SymX(atan)                                \
312       SymX(acos)                                \
313       SymX(asin)                                \
314       SymX(tan)                                 \
315       SymX(cos)                                 \
316       SymX(sin)                                 \
317       SymX(exp)                                 \
318       SymX(log)                                 \
319       SymX(sqrt)                                \
320       SymX(powf)                                 \
321       SymX(tanhf)                                \
322       SymX(coshf)                                \
323       SymX(sinhf)                                \
324       SymX(atanf)                                \
325       SymX(acosf)                                \
326       SymX(asinf)                                \
327       SymX(tanf)                                 \
328       SymX(cosf)                                 \
329       SymX(sinf)                                 \
330       SymX(expf)                                 \
331       SymX(logf)                                 \
332       SymX(sqrtf)                                \
333       SymX(memcpy)                              \
334       SymX(rts_InstallConsoleEvent)             \
335       SymX(rts_ConsoleHandlerDone)              \
336       Sym(mktime)                               \
337       Sym(_imp___timezone)                      \
338       Sym(_imp___tzname)                        \
339       Sym(_imp__tzname)                         \
340       Sym(_imp___iob)                           \
341       Sym(_imp___osver)                         \
342       Sym(localtime)                            \
343       Sym(gmtime)                               \
344       Sym(opendir)                              \
345       Sym(readdir)                              \
346       Sym(rewinddir)                            \
347       RTS_MINGW_EXTRA_SYMS                      \
348       RTS_MINGW_GETTIMEOFDAY_SYM                \
349       Sym(closedir)
350 #endif
351
352 #if defined(darwin_TARGET_OS) && HAVE_PRINTF_LDBLSTUB
353 #define RTS_DARWIN_ONLY_SYMBOLS                 \
354      Sym(asprintf$LDBLStub)                     \
355      Sym(err$LDBLStub)                          \
356      Sym(errc$LDBLStub)                         \
357      Sym(errx$LDBLStub)                         \
358      Sym(fprintf$LDBLStub)                      \
359      Sym(fscanf$LDBLStub)                       \
360      Sym(fwprintf$LDBLStub)                     \
361      Sym(fwscanf$LDBLStub)                      \
362      Sym(printf$LDBLStub)                       \
363      Sym(scanf$LDBLStub)                        \
364      Sym(snprintf$LDBLStub)                     \
365      Sym(sprintf$LDBLStub)                      \
366      Sym(sscanf$LDBLStub)                       \
367      Sym(strtold$LDBLStub)                      \
368      Sym(swprintf$LDBLStub)                     \
369      Sym(swscanf$LDBLStub)                      \
370      Sym(syslog$LDBLStub)                       \
371      Sym(vasprintf$LDBLStub)                    \
372      Sym(verr$LDBLStub)                         \
373      Sym(verrc$LDBLStub)                        \
374      Sym(verrx$LDBLStub)                        \
375      Sym(vfprintf$LDBLStub)                     \
376      Sym(vfscanf$LDBLStub)                      \
377      Sym(vfwprintf$LDBLStub)                    \
378      Sym(vfwscanf$LDBLStub)                     \
379      Sym(vprintf$LDBLStub)                      \
380      Sym(vscanf$LDBLStub)                       \
381      Sym(vsnprintf$LDBLStub)                    \
382      Sym(vsprintf$LDBLStub)                     \
383      Sym(vsscanf$LDBLStub)                      \
384      Sym(vswprintf$LDBLStub)                    \
385      Sym(vswscanf$LDBLStub)                     \
386      Sym(vsyslog$LDBLStub)                      \
387      Sym(vwarn$LDBLStub)                        \
388      Sym(vwarnc$LDBLStub)                       \
389      Sym(vwarnx$LDBLStub)                       \
390      Sym(vwprintf$LDBLStub)                     \
391      Sym(vwscanf$LDBLStub)                      \
392      Sym(warn$LDBLStub)                         \
393      Sym(warnc$LDBLStub)                        \
394      Sym(warnx$LDBLStub)                        \
395      Sym(wcstold$LDBLStub)                      \
396      Sym(wprintf$LDBLStub)                      \
397      Sym(wscanf$LDBLStub)
398 #else
399 #define RTS_DARWIN_ONLY_SYMBOLS
400 #endif
401
402 #ifndef SMP
403 # define MAIN_CAP_SYM SymX(MainCapability)
404 #else
405 # define MAIN_CAP_SYM
406 #endif
407
408 #if !defined(mingw32_HOST_OS)
409 #define RTS_USER_SIGNALS_SYMBOLS \
410    SymX(setIOManagerPipe)
411 #else
412 #define RTS_USER_SIGNALS_SYMBOLS \
413    SymX(sendIOManagerEvent) \
414    SymX(readIOManagerEvent) \
415    SymX(getIOManagerEvent) \
416    SymX(console_handler)
417 #endif
418
419 #ifdef TABLES_NEXT_TO_CODE
420 #define RTS_RET_SYMBOLS /* nothing */
421 #else
422 #define RTS_RET_SYMBOLS                         \
423       SymX(stg_enter_ret)                       \
424       SymX(stg_gc_fun_ret)                      \
425       SymX(stg_ap_v_ret)                        \
426       SymX(stg_ap_f_ret)                        \
427       SymX(stg_ap_d_ret)                        \
428       SymX(stg_ap_l_ret)                        \
429       SymX(stg_ap_n_ret)                        \
430       SymX(stg_ap_p_ret)                        \
431       SymX(stg_ap_pv_ret)                       \
432       SymX(stg_ap_pp_ret)                       \
433       SymX(stg_ap_ppv_ret)                      \
434       SymX(stg_ap_ppp_ret)                      \
435       SymX(stg_ap_pppv_ret)                     \
436       SymX(stg_ap_pppp_ret)                     \
437       SymX(stg_ap_ppppp_ret)                    \
438       SymX(stg_ap_pppppp_ret)
439 #endif
440
441 #define RTS_SYMBOLS                             \
442       Maybe_Stable_Names                        \
443       Sym(StgReturn)                            \
444       SymX(stg_enter_info)                      \
445       SymX(stg_gc_void_info)                    \
446       SymX(__stg_gc_enter_1)                    \
447       SymX(stg_gc_noregs)                       \
448       SymX(stg_gc_unpt_r1_info)                 \
449       SymX(stg_gc_unpt_r1)                      \
450       SymX(stg_gc_unbx_r1_info)                 \
451       SymX(stg_gc_unbx_r1)                      \
452       SymX(stg_gc_f1_info)                      \
453       SymX(stg_gc_f1)                           \
454       SymX(stg_gc_d1_info)                      \
455       SymX(stg_gc_d1)                           \
456       SymX(stg_gc_l1_info)                      \
457       SymX(stg_gc_l1)                           \
458       SymX(__stg_gc_fun)                        \
459       SymX(stg_gc_fun_info)                     \
460       SymX(stg_gc_gen)                          \
461       SymX(stg_gc_gen_info)                     \
462       SymX(stg_gc_gen_hp)                       \
463       SymX(stg_gc_ut)                           \
464       SymX(stg_gen_yield)                       \
465       SymX(stg_yield_noregs)                    \
466       SymX(stg_yield_to_interpreter)            \
467       SymX(stg_gen_block)                       \
468       SymX(stg_block_noregs)                    \
469       SymX(stg_block_1)                         \
470       SymX(stg_block_takemvar)                  \
471       SymX(stg_block_putmvar)                   \
472       MAIN_CAP_SYM                              \
473       SymX(MallocFailHook)                      \
474       SymX(OnExitHook)                          \
475       SymX(OutOfHeapHook)                       \
476       SymX(StackOverflowHook)                   \
477       SymX(__encodeDouble)                      \
478       SymX(__encodeFloat)                       \
479       SymX(addDLL)                              \
480       SymExtern(__gmpn_gcd_1)                   \
481       SymExtern(__gmpz_cmp)                     \
482       SymExtern(__gmpz_cmp_si)                  \
483       SymExtern(__gmpz_cmp_ui)                  \
484       SymExtern(__gmpz_get_si)                  \
485       SymExtern(__gmpz_get_ui)                  \
486       SymX(__int_encodeDouble)                  \
487       SymX(__int_encodeFloat)                   \
488       SymX(andIntegerzh_fast)                   \
489       SymX(atomicallyzh_fast)                   \
490       SymX(barf)                                \
491       SymX(debugBelch)                          \
492       SymX(errorBelch)                          \
493       SymX(blockAsyncExceptionszh_fast)         \
494       SymX(catchzh_fast)                        \
495       SymX(catchRetryzh_fast)                   \
496       SymX(catchSTMzh_fast)                     \
497       SymX(checkzh_fast)                        \
498       SymX(closure_flags)                       \
499       SymX(cmp_thread)                          \
500       SymX(cmpIntegerzh_fast)                   \
501       SymX(cmpIntegerIntzh_fast)                \
502       SymX(complementIntegerzh_fast)            \
503       SymX(createAdjustor)                      \
504       SymX(decodeDoublezh_fast)                 \
505       SymX(decodeFloatzh_fast)                  \
506       SymX(defaultsHook)                        \
507       SymX(delayzh_fast)                        \
508       SymX(deRefWeakzh_fast)                    \
509       SymX(deRefStablePtrzh_fast)               \
510       SymX(dirty_MUT_VAR)                       \
511       SymX(divExactIntegerzh_fast)              \
512       SymX(divModIntegerzh_fast)                \
513       SymX(forkzh_fast)                         \
514       SymX(forkOnzh_fast)                       \
515       SymX(forkProcess)                         \
516       SymX(forkOS_createThread)                 \
517       SymX(freeHaskellFunctionPtr)              \
518       SymX(freeStablePtr)                       \
519       SymX(getOrSetTypeableStore)               \
520       SymX(gcdIntegerzh_fast)                   \
521       SymX(gcdIntegerIntzh_fast)                \
522       SymX(gcdIntzh_fast)                       \
523       SymX(genSymZh)                            \
524       SymX(genericRaise)                        \
525       SymX(getProgArgv)                         \
526       SymX(getFullProgArgv)                             \
527       SymX(getStablePtr)                        \
528       SymX(hs_init)                             \
529       SymX(hs_exit)                             \
530       SymX(hs_set_argv)                         \
531       SymX(hs_add_root)                         \
532       SymX(hs_perform_gc)                       \
533       SymX(hs_free_stable_ptr)                  \
534       SymX(hs_free_fun_ptr)                     \
535       SymX(initLinker)                          \
536       SymX(unpackClosurezh_fast)                \
537       SymX(getApStackValzh_fast)                \
538       SymX(int2Integerzh_fast)                  \
539       SymX(integer2Intzh_fast)                  \
540       SymX(integer2Wordzh_fast)                 \
541       SymX(isCurrentThreadBoundzh_fast)         \
542       SymX(isDoubleDenormalized)                \
543       SymX(isDoubleInfinite)                    \
544       SymX(isDoubleNaN)                         \
545       SymX(isDoubleNegativeZero)                \
546       SymX(isEmptyMVarzh_fast)                  \
547       SymX(isFloatDenormalized)                 \
548       SymX(isFloatInfinite)                     \
549       SymX(isFloatNaN)                          \
550       SymX(isFloatNegativeZero)                 \
551       SymX(killThreadzh_fast)                   \
552       SymX(loadObj)                             \
553       SymX(insertStableSymbol)                  \
554       SymX(insertSymbol)                        \
555       SymX(lookupSymbol)                        \
556       SymX(makeStablePtrzh_fast)                \
557       SymX(minusIntegerzh_fast)                 \
558       SymX(mkApUpd0zh_fast)                     \
559       SymX(myThreadIdzh_fast)                   \
560       SymX(labelThreadzh_fast)                  \
561       SymX(newArrayzh_fast)                     \
562       SymX(newBCOzh_fast)                       \
563       SymX(newByteArrayzh_fast)                 \
564       SymX_redirect(newCAF, newDynCAF)          \
565       SymX(newMVarzh_fast)                      \
566       SymX(newMutVarzh_fast)                    \
567       SymX(newTVarzh_fast)                      \
568       SymX(noDuplicatezh_fast)                  \
569       SymX(atomicModifyMutVarzh_fast)           \
570       SymX(newPinnedByteArrayzh_fast)           \
571       SymX(newSpark)                            \
572       SymX(orIntegerzh_fast)                    \
573       SymX(performGC)                           \
574       SymX(performMajorGC)                      \
575       SymX(plusIntegerzh_fast)                  \
576       SymX(prog_argc)                           \
577       SymX(prog_argv)                           \
578       SymX(putMVarzh_fast)                      \
579       SymX(quotIntegerzh_fast)                  \
580       SymX(quotRemIntegerzh_fast)               \
581       SymX(raisezh_fast)                        \
582       SymX(raiseIOzh_fast)                      \
583       SymX(readTVarzh_fast)                     \
584       SymX(remIntegerzh_fast)                   \
585       SymX(resetNonBlockingFd)                  \
586       SymX(resumeThread)                        \
587       SymX(resolveObjs)                         \
588       SymX(retryzh_fast)                        \
589       SymX(rts_apply)                           \
590       SymX(rts_checkSchedStatus)                \
591       SymX(rts_eval)                            \
592       SymX(rts_evalIO)                          \
593       SymX(rts_evalLazyIO)                      \
594       SymX(rts_evalStableIO)                    \
595       SymX(rts_eval_)                           \
596       SymX(rts_getBool)                         \
597       SymX(rts_getChar)                         \
598       SymX(rts_getDouble)                       \
599       SymX(rts_getFloat)                        \
600       SymX(rts_getInt)                          \
601       SymX(rts_getInt32)                        \
602       SymX(rts_getPtr)                          \
603       SymX(rts_getFunPtr)                       \
604       SymX(rts_getStablePtr)                    \
605       SymX(rts_getThreadId)                     \
606       SymX(rts_getWord)                         \
607       SymX(rts_getWord32)                       \
608       SymX(rts_lock)                            \
609       SymX(rts_mkBool)                          \
610       SymX(rts_mkChar)                          \
611       SymX(rts_mkDouble)                        \
612       SymX(rts_mkFloat)                         \
613       SymX(rts_mkInt)                           \
614       SymX(rts_mkInt16)                         \
615       SymX(rts_mkInt32)                         \
616       SymX(rts_mkInt64)                         \
617       SymX(rts_mkInt8)                          \
618       SymX(rts_mkPtr)                           \
619       SymX(rts_mkFunPtr)                        \
620       SymX(rts_mkStablePtr)                     \
621       SymX(rts_mkString)                        \
622       SymX(rts_mkWord)                          \
623       SymX(rts_mkWord16)                        \
624       SymX(rts_mkWord32)                        \
625       SymX(rts_mkWord64)                        \
626       SymX(rts_mkWord8)                         \
627       SymX(rts_unlock)                          \
628       SymX(rtsSupportsBoundThreads)             \
629       SymX(__hscore_get_saved_termios)          \
630       SymX(__hscore_set_saved_termios)          \
631       SymX(setProgArgv)                         \
632       SymX(startupHaskell)                      \
633       SymX(shutdownHaskell)                     \
634       SymX(shutdownHaskellAndExit)              \
635       SymX(stable_ptr_table)                    \
636       SymX(stackOverflow)                       \
637       SymX(stg_CAF_BLACKHOLE_info)              \
638       SymX(awakenBlockedQueue)                  \
639       SymX(stg_CHARLIKE_closure)                \
640       SymX(stg_EMPTY_MVAR_info)                 \
641       SymX(stg_IND_STATIC_info)                 \
642       SymX(stg_INTLIKE_closure)                 \
643       SymX(stg_MUT_ARR_PTRS_DIRTY_info)         \
644       SymX(stg_MUT_ARR_PTRS_FROZEN_info)        \
645       SymX(stg_MUT_ARR_PTRS_FROZEN0_info)       \
646       SymX(stg_WEAK_info)                       \
647       SymX(stg_ap_v_info)                       \
648       SymX(stg_ap_f_info)                       \
649       SymX(stg_ap_d_info)                       \
650       SymX(stg_ap_l_info)                       \
651       SymX(stg_ap_n_info)                       \
652       SymX(stg_ap_p_info)                       \
653       SymX(stg_ap_pv_info)                      \
654       SymX(stg_ap_pp_info)                      \
655       SymX(stg_ap_ppv_info)                     \
656       SymX(stg_ap_ppp_info)                     \
657       SymX(stg_ap_pppv_info)                    \
658       SymX(stg_ap_pppp_info)                    \
659       SymX(stg_ap_ppppp_info)                   \
660       SymX(stg_ap_pppppp_info)                  \
661       SymX(stg_ap_0_fast)                       \
662       SymX(stg_ap_v_fast)                       \
663       SymX(stg_ap_f_fast)                       \
664       SymX(stg_ap_d_fast)                       \
665       SymX(stg_ap_l_fast)                       \
666       SymX(stg_ap_n_fast)                       \
667       SymX(stg_ap_p_fast)                       \
668       SymX(stg_ap_pv_fast)                      \
669       SymX(stg_ap_pp_fast)                      \
670       SymX(stg_ap_ppv_fast)                     \
671       SymX(stg_ap_ppp_fast)                     \
672       SymX(stg_ap_pppv_fast)                    \
673       SymX(stg_ap_pppp_fast)                    \
674       SymX(stg_ap_ppppp_fast)                   \
675       SymX(stg_ap_pppppp_fast)                  \
676       SymX(stg_ap_1_upd_info)                   \
677       SymX(stg_ap_2_upd_info)                   \
678       SymX(stg_ap_3_upd_info)                   \
679       SymX(stg_ap_4_upd_info)                   \
680       SymX(stg_ap_5_upd_info)                   \
681       SymX(stg_ap_6_upd_info)                   \
682       SymX(stg_ap_7_upd_info)                   \
683       SymX(stg_exit)                            \
684       SymX(stg_sel_0_upd_info)                  \
685       SymX(stg_sel_10_upd_info)                 \
686       SymX(stg_sel_11_upd_info)                 \
687       SymX(stg_sel_12_upd_info)                 \
688       SymX(stg_sel_13_upd_info)                 \
689       SymX(stg_sel_14_upd_info)                 \
690       SymX(stg_sel_15_upd_info)                 \
691       SymX(stg_sel_1_upd_info)                  \
692       SymX(stg_sel_2_upd_info)                  \
693       SymX(stg_sel_3_upd_info)                  \
694       SymX(stg_sel_4_upd_info)                  \
695       SymX(stg_sel_5_upd_info)                  \
696       SymX(stg_sel_6_upd_info)                  \
697       SymX(stg_sel_7_upd_info)                  \
698       SymX(stg_sel_8_upd_info)                  \
699       SymX(stg_sel_9_upd_info)                  \
700       SymX(stg_upd_frame_info)                  \
701       SymX(suspendThread)                       \
702       SymX(takeMVarzh_fast)                     \
703       SymX(timesIntegerzh_fast)                 \
704       SymX(tryPutMVarzh_fast)                   \
705       SymX(tryTakeMVarzh_fast)                  \
706       SymX(unblockAsyncExceptionszh_fast)       \
707       SymX(unloadObj)                           \
708       SymX(unsafeThawArrayzh_fast)              \
709       SymX(waitReadzh_fast)                     \
710       SymX(waitWritezh_fast)                    \
711       SymX(word2Integerzh_fast)                 \
712       SymX(writeTVarzh_fast)                    \
713       SymX(xorIntegerzh_fast)                   \
714       SymX(yieldzh_fast)                        \
715       SymX(stg_interp_constr_entry)             \
716       SymX(allocateExec)                        \
717       SymX(freeExec)                            \
718       SymX(getAllocations)                      \
719       SymX(revertCAFs)                          \
720       SymX(RtsFlags)                            \
721       SymX(rts_breakpoint_io_action)            \
722       SymX(rts_stop_next_breakpoint)            \
723       SymX(rts_stop_on_exception)               \
724       RTS_USER_SIGNALS_SYMBOLS
725
726 #ifdef SUPPORT_LONG_LONGS
727 #define RTS_LONG_LONG_SYMS                      \
728       SymX(int64ToIntegerzh_fast)               \
729       SymX(word64ToIntegerzh_fast)
730 #else
731 #define RTS_LONG_LONG_SYMS /* nothing */
732 #endif
733
734 // 64-bit support functions in libgcc.a
735 #if defined(__GNUC__) && SIZEOF_VOID_P <= 4
736 #define RTS_LIBGCC_SYMBOLS                      \
737       Sym(__divdi3)                             \
738       Sym(__udivdi3)                            \
739       Sym(__moddi3)                             \
740       Sym(__umoddi3)                            \
741       Sym(__muldi3)                             \
742       Sym(__ashldi3)                            \
743       Sym(__ashrdi3)                            \
744       Sym(__lshrdi3)                            \
745       Sym(__eprintf)
746 #elif defined(ia64_HOST_ARCH)
747 #define RTS_LIBGCC_SYMBOLS                      \
748       Sym(__divdi3)                             \
749       Sym(__udivdi3)                            \
750       Sym(__moddi3)                             \
751       Sym(__umoddi3)                            \
752       Sym(__divsf3)                             \
753       Sym(__divdf3)
754 #else
755 #define RTS_LIBGCC_SYMBOLS
756 #endif
757
758 #if defined(darwin_HOST_OS) && defined(powerpc_HOST_ARCH)
759       // Symbols that don't have a leading underscore
760       // on Mac OS X. They have to receive special treatment,
761       // see machoInitSymbolsWithoutUnderscore()
762 #define RTS_MACHO_NOUNDERLINE_SYMBOLS           \
763       Sym(saveFP)                               \
764       Sym(restFP)
765 #endif
766
767 /* entirely bogus claims about types of these symbols */
768 #define Sym(vvv)  extern void vvv(void);
769 #if defined(__PIC__) && defined(mingw32_TARGET_OS)
770 #define SymExtern(vvv)  extern void _imp__ ## vvv (void);
771 #else
772 #define SymExtern(vvv)  SymX(vvv)
773 #endif
774 #define SymX(vvv) /**/
775 #define SymX_redirect(vvv,xxx) /**/
776 RTS_SYMBOLS
777 RTS_RET_SYMBOLS
778 RTS_LONG_LONG_SYMS
779 RTS_POSIX_ONLY_SYMBOLS
780 RTS_MINGW_ONLY_SYMBOLS
781 RTS_CYGWIN_ONLY_SYMBOLS
782 RTS_DARWIN_ONLY_SYMBOLS
783 RTS_LIBGCC_SYMBOLS
784 #undef Sym
785 #undef SymX
786 #undef SymX_redirect
787 #undef SymExtern
788
789 #ifdef LEADING_UNDERSCORE
790 #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s)
791 #else
792 #define MAYBE_LEADING_UNDERSCORE_STR(s) (s)
793 #endif
794
795 #define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
796                     (void*)(&(vvv)) },
797 #define SymX(vvv) Sym(vvv)
798 #define SymExtern(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
799             (void*)DLL_IMPORT_DATA_REF(vvv) },
800
801 // SymX_redirect allows us to redirect references to one symbol to
802 // another symbol.  See newCAF/newDynCAF for an example.
803 #define SymX_redirect(vvv,xxx) \
804     { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
805       (void*)(&(xxx)) },
806
807 static RtsSymbolVal rtsSyms[] = {
808       RTS_SYMBOLS
809       RTS_RET_SYMBOLS
810       RTS_LONG_LONG_SYMS
811       RTS_POSIX_ONLY_SYMBOLS
812       RTS_MINGW_ONLY_SYMBOLS
813       RTS_CYGWIN_ONLY_SYMBOLS
814       RTS_DARWIN_ONLY_SYMBOLS
815       RTS_LIBGCC_SYMBOLS
816 #if defined(darwin_HOST_OS) && defined(i386_HOST_ARCH)
817       // dyld stub code contains references to this,
818       // but it should never be called because we treat
819       // lazy pointers as nonlazy.
820       { "dyld_stub_binding_helper", (void*)0xDEADBEEF },
821 #endif
822       { 0, 0 } /* sentinel */
823 };
824
825
826
827 /* -----------------------------------------------------------------------------
828  * Insert symbols into hash tables, checking for duplicates.
829  */
830
831 static void ghciInsertStrHashTable ( char* obj_name,
832                                      HashTable *table,
833                                      char* key,
834                                      void *data
835                                    )
836 {
837    if (lookupHashTable(table, (StgWord)key) == NULL)
838    {
839       insertStrHashTable(table, (StgWord)key, data);
840       return;
841    }
842    debugBelch(
843       "\n\n"
844       "GHCi runtime linker: fatal error: I found a duplicate definition for symbol\n"
845       "   %s\n"
846       "whilst processing object file\n"
847       "   %s\n"
848       "This could be caused by:\n"
849       "   * Loading two different object files which export the same symbol\n"
850       "   * Specifying the same object file twice on the GHCi command line\n"
851       "   * An incorrect `package.conf' entry, causing some object to be\n"
852       "     loaded twice.\n"
853       "GHCi cannot safely continue in this situation.  Exiting now.  Sorry.\n"
854       "\n",
855       (char*)key,
856       obj_name
857    );
858    exit(1);
859 }
860 /* -----------------------------------------------------------------------------
861  * initialize the object linker
862  */
863
864
865 static int linker_init_done = 0 ;
866
867 #if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
868 static void *dl_prog_handle;
869 #endif
870
871 void
872 initLinker( void )
873 {
874     RtsSymbolVal *sym;
875
876     /* Make initLinker idempotent, so we can call it
877        before evey relevant operation; that means we
878        don't need to initialise the linker separately */
879     if (linker_init_done == 1) { return; } else {
880       linker_init_done = 1;
881     }
882
883     stablehash = allocStrHashTable();
884     symhash = allocStrHashTable();
885
886     /* populate the symbol table with stuff from the RTS */
887     for (sym = rtsSyms; sym->lbl != NULL; sym++) {
888         ghciInsertStrHashTable("(GHCi built-in symbols)",
889                                symhash, sym->lbl, sym->addr);
890     }
891 #   if defined(OBJFORMAT_MACHO) && defined(powerpc_HOST_ARCH)
892     machoInitSymbolsWithoutUnderscore();
893 #   endif
894
895 #   if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
896 #   if defined(RTLD_DEFAULT)
897     dl_prog_handle = RTLD_DEFAULT;
898 #   else
899     dl_prog_handle = dlopen(NULL, RTLD_LAZY);
900 #   endif /* RTLD_DEFAULT */
901 #   endif
902 }
903
904 /* -----------------------------------------------------------------------------
905  *                  Loading DLL or .so dynamic libraries
906  * -----------------------------------------------------------------------------
907  *
908  * Add a DLL from which symbols may be found.  In the ELF case, just
909  * do RTLD_GLOBAL-style add, so no further messing around needs to
910  * happen in order that symbols in the loaded .so are findable --
911  * lookupSymbol() will subsequently see them by dlsym on the program's
912  * dl-handle.  Returns NULL if success, otherwise ptr to an err msg.
913  *
914  * In the PEi386 case, open the DLLs and put handles to them in a
915  * linked list.  When looking for a symbol, try all handles in the
916  * list.  This means that we need to load even DLLs that are guaranteed
917  * to be in the ghc.exe image already, just so we can get a handle
918  * to give to loadSymbol, so that we can find the symbols.  For such
919  * libraries, the LoadLibrary call should be a no-op except for returning
920  * the handle.
921  *
922  */
923
924 #if defined(OBJFORMAT_PEi386)
925 /* A record for storing handles into DLLs. */
926
927 typedef
928    struct _OpenedDLL {
929       char*              name;
930       struct _OpenedDLL* next;
931       HINSTANCE instance;
932    }
933    OpenedDLL;
934
935 /* A list thereof. */
936 static OpenedDLL* opened_dlls = NULL;
937 #endif
938
939 char *
940 addDLL( char *dll_name )
941 {
942 #  if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
943    /* ------------------- ELF DLL loader ------------------- */
944    void *hdl;
945    char *errmsg;
946
947    initLinker();
948
949    hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL);
950
951    if (hdl == NULL) {
952       /* dlopen failed; return a ptr to the error msg. */
953       errmsg = dlerror();
954       if (errmsg == NULL) errmsg = "addDLL: unknown error";
955       return errmsg;
956    } else {
957       return NULL;
958    }
959    /*NOTREACHED*/
960
961 #  elif defined(OBJFORMAT_PEi386)
962    /* ------------------- Win32 DLL loader ------------------- */
963
964    char*      buf;
965    OpenedDLL* o_dll;
966    HINSTANCE  instance;
967
968    initLinker();
969
970    /* debugBelch("\naddDLL; dll_name = `%s'\n", dll_name); */
971
972    /* See if we've already got it, and ignore if so. */
973    for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) {
974       if (0 == strcmp(o_dll->name, dll_name))
975          return NULL;
976    }
977
978    /* The file name has no suffix (yet) so that we can try
979       both foo.dll and foo.drv
980
981       The documentation for LoadLibrary says:
982         If no file name extension is specified in the lpFileName
983         parameter, the default library extension .dll is
984         appended. However, the file name string can include a trailing
985         point character (.) to indicate that the module name has no
986         extension. */
987
988    buf = stgMallocBytes(strlen(dll_name) + 10, "addDLL");
989    sprintf(buf, "%s.DLL", dll_name);
990    instance = LoadLibrary(buf);
991    if (instance == NULL) {
992          sprintf(buf, "%s.DRV", dll_name);      // KAA: allow loading of drivers (like winspool.drv)
993          instance = LoadLibrary(buf);
994          if (instance == NULL) {
995                 stgFree(buf);
996
997             /* LoadLibrary failed; return a ptr to the error msg. */
998             return "addDLL: unknown error";
999          }
1000    }
1001    stgFree(buf);
1002
1003    /* Add this DLL to the list of DLLs in which to search for symbols. */
1004    o_dll = stgMallocBytes( sizeof(OpenedDLL), "addDLL" );
1005    o_dll->name     = stgMallocBytes(1+strlen(dll_name), "addDLL");
1006    strcpy(o_dll->name, dll_name);
1007    o_dll->instance = instance;
1008    o_dll->next     = opened_dlls;
1009    opened_dlls     = o_dll;
1010
1011    return NULL;
1012 #  else
1013    barf("addDLL: not implemented on this platform");
1014 #  endif
1015 }
1016
1017 /* -----------------------------------------------------------------------------
1018  * insert a stable symbol in the hash table
1019  */
1020
1021 void
1022 insertStableSymbol(char* obj_name, char* key, StgPtr p)
1023 {
1024   ghciInsertStrHashTable(obj_name, stablehash, key, getStablePtr(p));
1025 }
1026
1027
1028 /* -----------------------------------------------------------------------------
1029  * insert a symbol in the hash table
1030  */
1031 void
1032 insertSymbol(char* obj_name, char* key, void* data)
1033 {
1034   ghciInsertStrHashTable(obj_name, symhash, key, data);
1035 }
1036
1037 /* -----------------------------------------------------------------------------
1038  * lookup a symbol in the hash table
1039  */
1040 void *
1041 lookupSymbol( char *lbl )
1042 {
1043     void *val;
1044     initLinker() ;
1045     ASSERT(symhash != NULL);
1046     val = lookupStrHashTable(symhash, lbl);
1047
1048     if (val == NULL) {
1049 #       if defined(OBJFORMAT_ELF)
1050 #       if defined(x86_64_HOST_ARCH)
1051         val = dlsym(dl_prog_handle, lbl);
1052         if (val >= (void *)0x80000000) {
1053             void *new_val;
1054             new_val = x86_64_high_symbol(lbl, val);
1055             IF_DEBUG(linker,debugBelch("lookupSymbol: relocating out of range symbol: %s = %p, now %p\n", lbl, val, new_val));
1056             return new_val;
1057         } else {
1058             return val;
1059         }
1060 #       else
1061         return dlsym(dl_prog_handle, lbl);
1062 #       endif
1063 #       elif defined(OBJFORMAT_MACHO)
1064         if(NSIsSymbolNameDefined(lbl)) {
1065             NSSymbol symbol = NSLookupAndBindSymbol(lbl);
1066             return NSAddressOfSymbol(symbol);
1067         } else {
1068             return NULL;
1069         }
1070 #       elif defined(OBJFORMAT_PEi386)
1071         OpenedDLL* o_dll;
1072         void* sym;
1073         for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) {
1074           /* debugBelch("look in %s for %s\n", o_dll->name, lbl); */
1075            if (lbl[0] == '_') {
1076               /* HACK: if the name has an initial underscore, try stripping
1077                  it off & look that up first. I've yet to verify whether there's
1078                  a Rule that governs whether an initial '_' *should always* be
1079                  stripped off when mapping from import lib name to the DLL name.
1080               */
1081               sym = GetProcAddress(o_dll->instance, (lbl+1));
1082               if (sym != NULL) {
1083                 /*debugBelch("found %s in %s\n", lbl+1,o_dll->name);*/
1084                 return sym;
1085               }
1086            }
1087            sym = GetProcAddress(o_dll->instance, lbl);
1088            if (sym != NULL) {
1089              /*debugBelch("found %s in %s\n", lbl,o_dll->name);*/
1090              return sym;
1091            }
1092         }
1093         return NULL;
1094 #       else
1095         ASSERT(2+2 == 5);
1096         return NULL;
1097 #       endif
1098     } else {
1099         return val;
1100     }
1101 }
1102
1103 static
1104 __attribute((unused))
1105 void *
1106 lookupLocalSymbol( ObjectCode* oc, char *lbl )
1107 {
1108     void *val;
1109     initLinker() ;
1110     val = lookupStrHashTable(oc->lochash, lbl);
1111
1112     if (val == NULL) {
1113         return NULL;
1114     } else {
1115         return val;
1116     }
1117 }
1118
1119
1120 /* -----------------------------------------------------------------------------
1121  * Debugging aid: look in GHCi's object symbol tables for symbols
1122  * within DELTA bytes of the specified address, and show their names.
1123  */
1124 #ifdef DEBUG
1125 void ghci_enquire ( char* addr );
1126
1127 void ghci_enquire ( char* addr )
1128 {
1129    int   i;
1130    char* sym;
1131    char* a;
1132    const int DELTA = 64;
1133    ObjectCode* oc;
1134
1135    initLinker();
1136
1137    for (oc = objects; oc; oc = oc->next) {
1138       for (i = 0; i < oc->n_symbols; i++) {
1139          sym = oc->symbols[i];
1140          if (sym == NULL) continue;
1141          // debugBelch("enquire %p %p\n", sym, oc->lochash);
1142          a = NULL;
1143          if (oc->lochash != NULL) {
1144             a = lookupStrHashTable(oc->lochash, sym);
1145          }
1146          if (a == NULL) {
1147             a = lookupStrHashTable(symhash, sym);
1148          }
1149          if (a == NULL) {
1150              // debugBelch("ghci_enquire: can't find %s\n", sym);
1151          }
1152          else if (addr-DELTA <= a && a <= addr+DELTA) {
1153             debugBelch("%p + %3d  ==  `%s'\n", addr, (int)(a - addr), sym);
1154          }
1155       }
1156    }
1157 }
1158 #endif
1159
1160 #ifdef ia64_HOST_ARCH
1161 static unsigned int PLTSize(void);
1162 #endif
1163
1164 /* -----------------------------------------------------------------------------
1165  * Load an obj (populate the global symbol table, but don't resolve yet)
1166  *
1167  * Returns: 1 if ok, 0 on error.
1168  */
1169 HsInt
1170 loadObj( char *path )
1171 {
1172    ObjectCode* oc;
1173    struct stat st;
1174    int r, n;
1175 #ifdef USE_MMAP
1176    int fd, pagesize;
1177    void *map_addr = NULL;
1178 #else
1179    FILE *f;
1180 #endif
1181    initLinker();
1182
1183    /* debugBelch("loadObj %s\n", path ); */
1184
1185    /* Check that we haven't already loaded this object.
1186       Ignore requests to load multiple times */
1187    {
1188        ObjectCode *o;
1189        int is_dup = 0;
1190        for (o = objects; o; o = o->next) {
1191           if (0 == strcmp(o->fileName, path)) {
1192              is_dup = 1;
1193              break; /* don't need to search further */
1194           }
1195        }
1196        if (is_dup) {
1197           IF_DEBUG(linker, debugBelch(
1198             "GHCi runtime linker: warning: looks like you're trying to load the\n"
1199             "same object file twice:\n"
1200             "   %s\n"
1201             "GHCi will ignore this, but be warned.\n"
1202             , path));
1203           return 1; /* success */
1204        }
1205    }
1206
1207    oc = stgMallocBytes(sizeof(ObjectCode), "loadObj(oc)");
1208
1209 #  if defined(OBJFORMAT_ELF)
1210    oc->formatName = "ELF";
1211 #  elif defined(OBJFORMAT_PEi386)
1212    oc->formatName = "PEi386";
1213 #  elif defined(OBJFORMAT_MACHO)
1214    oc->formatName = "Mach-O";
1215 #  else
1216    stgFree(oc);
1217    barf("loadObj: not implemented on this platform");
1218 #  endif
1219
1220    r = stat(path, &st);
1221    if (r == -1) { return 0; }
1222
1223    /* sigh, strdup() isn't a POSIX function, so do it the long way */
1224    oc->fileName = stgMallocBytes( strlen(path)+1, "loadObj" );
1225    strcpy(oc->fileName, path);
1226
1227    oc->fileSize          = st.st_size;
1228    oc->symbols           = NULL;
1229    oc->sections          = NULL;
1230    oc->lochash           = allocStrHashTable();
1231    oc->proddables        = NULL;
1232
1233    /* chain it onto the list of objects */
1234    oc->next              = objects;
1235    objects               = oc;
1236
1237 #ifdef USE_MMAP
1238 #define ROUND_UP(x,size) ((x + size - 1) & ~(size - 1))
1239
1240    /* On many architectures malloc'd memory isn't executable, so we need to use mmap. */
1241
1242 #if defined(openbsd_HOST_OS)
1243    fd = open(path, O_RDONLY, S_IRUSR);
1244 #else
1245    fd = open(path, O_RDONLY);
1246 #endif
1247    if (fd == -1)
1248       barf("loadObj: can't open `%s'", path);
1249
1250    pagesize = getpagesize();
1251
1252 #ifdef ia64_HOST_ARCH
1253    /* The PLT needs to be right before the object */
1254    n = ROUND_UP(PLTSize(), pagesize);
1255    oc->plt = mmap(NULL, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
1256    if (oc->plt == MAP_FAILED)
1257       barf("loadObj: can't allocate PLT");
1258
1259    oc->pltIndex = 0;
1260    map_addr = oc->plt + n;
1261 #endif
1262
1263    n = ROUND_UP(oc->fileSize, pagesize);
1264
1265    /* Link objects into the lower 2Gb on x86_64.  GHC assumes the
1266     * small memory model on this architecture (see gcc docs,
1267     * -mcmodel=small).
1268     */
1269 #ifdef x86_64_HOST_ARCH
1270 #define EXTRA_MAP_FLAGS MAP_32BIT
1271 #else
1272 #define EXTRA_MAP_FLAGS 0
1273 #endif
1274
1275    oc->image = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE,
1276                     MAP_PRIVATE|EXTRA_MAP_FLAGS, fd, 0);
1277    if (oc->image == MAP_FAILED)
1278       barf("loadObj: can't map `%s'", path);
1279
1280    close(fd);
1281
1282 #else /* !USE_MMAP */
1283
1284    /* load the image into memory */
1285    f = fopen(path, "rb");
1286    if (!f)
1287        barf("loadObj: can't read `%s'", path);
1288
1289 #   if defined(mingw32_HOST_OS)
1290         // TODO: We would like to use allocateExec here, but allocateExec
1291         //       cannot currently allocate blocks large enough.
1292     oc->image = VirtualAlloc(NULL, oc->fileSize, MEM_RESERVE | MEM_COMMIT,
1293                              PAGE_EXECUTE_READWRITE);
1294 #   elif defined(darwin_HOST_OS)
1295     // In a Mach-O .o file, all sections can and will be misaligned
1296     // if the total size of the headers is not a multiple of the
1297     // desired alignment. This is fine for .o files that only serve
1298     // as input for the static linker, but it's not fine for us,
1299     // as SSE (used by gcc for floating point) and Altivec require
1300     // 16-byte alignment.
1301     // We calculate the correct alignment from the header before
1302     // reading the file, and then we misalign oc->image on purpose so
1303     // that the actual sections end up aligned again.
1304    oc->misalignment = machoGetMisalignment(f);
1305    oc->image = stgMallocBytes(oc->fileSize + oc->misalignment, "loadObj(image)");
1306    oc->image += oc->misalignment;
1307 #  else
1308    oc->image = stgMallocBytes(oc->fileSize, "loadObj(image)");
1309 #  endif
1310
1311    n = fread ( oc->image, 1, oc->fileSize, f );
1312    if (n != oc->fileSize)
1313       barf("loadObj: error whilst reading `%s'", path);
1314
1315    fclose(f);
1316 #endif /* USE_MMAP */
1317
1318 #  if defined(OBJFORMAT_MACHO) && (defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH))
1319    r = ocAllocateSymbolExtras_MachO ( oc );
1320    if (!r) { return r; }
1321 #  elif defined(OBJFORMAT_ELF) && defined(powerpc_HOST_ARCH)
1322    r = ocAllocateSymbolExtras_ELF ( oc );
1323    if (!r) { return r; }
1324 #endif
1325
1326    /* verify the in-memory image */
1327 #  if defined(OBJFORMAT_ELF)
1328    r = ocVerifyImage_ELF ( oc );
1329 #  elif defined(OBJFORMAT_PEi386)
1330    r = ocVerifyImage_PEi386 ( oc );
1331 #  elif defined(OBJFORMAT_MACHO)
1332    r = ocVerifyImage_MachO ( oc );
1333 #  else
1334    barf("loadObj: no verify method");
1335 #  endif
1336    if (!r) { return r; }
1337
1338    /* build the symbol list for this image */
1339 #  if defined(OBJFORMAT_ELF)
1340    r = ocGetNames_ELF ( oc );
1341 #  elif defined(OBJFORMAT_PEi386)
1342    r = ocGetNames_PEi386 ( oc );
1343 #  elif defined(OBJFORMAT_MACHO)
1344    r = ocGetNames_MachO ( oc );
1345 #  else
1346    barf("loadObj: no getNames method");
1347 #  endif
1348    if (!r) { return r; }
1349
1350    /* loaded, but not resolved yet */
1351    oc->status = OBJECT_LOADED;
1352
1353    return 1;
1354 }
1355
1356 /* -----------------------------------------------------------------------------
1357  * resolve all the currently unlinked objects in memory
1358  *
1359  * Returns: 1 if ok, 0 on error.
1360  */
1361 HsInt
1362 resolveObjs( void )
1363 {
1364     ObjectCode *oc;
1365     int r;
1366
1367     initLinker();
1368
1369     for (oc = objects; oc; oc = oc->next) {
1370         if (oc->status != OBJECT_RESOLVED) {
1371 #           if defined(OBJFORMAT_ELF)
1372             r = ocResolve_ELF ( oc );
1373 #           elif defined(OBJFORMAT_PEi386)
1374             r = ocResolve_PEi386 ( oc );
1375 #           elif defined(OBJFORMAT_MACHO)
1376             r = ocResolve_MachO ( oc );
1377 #           else
1378             barf("resolveObjs: not implemented on this platform");
1379 #           endif
1380             if (!r) { return r; }
1381             oc->status = OBJECT_RESOLVED;
1382         }
1383     }
1384     return 1;
1385 }
1386
1387 /* -----------------------------------------------------------------------------
1388  * delete an object from the pool
1389  */
1390 HsInt
1391 unloadObj( char *path )
1392 {
1393     ObjectCode *oc, *prev;
1394
1395     ASSERT(symhash != NULL);
1396     ASSERT(objects != NULL);
1397
1398     initLinker();
1399
1400     prev = NULL;
1401     for (oc = objects; oc; prev = oc, oc = oc->next) {
1402         if (!strcmp(oc->fileName,path)) {
1403
1404             /* Remove all the mappings for the symbols within this
1405              * object..
1406              */
1407             {
1408                 int i;
1409                 for (i = 0; i < oc->n_symbols; i++) {
1410                    if (oc->symbols[i] != NULL) {
1411                        removeStrHashTable(symhash, oc->symbols[i], NULL);
1412                    }
1413                 }
1414             }
1415
1416             if (prev == NULL) {
1417                 objects = oc->next;
1418             } else {
1419                 prev->next = oc->next;
1420             }
1421
1422             // We're going to leave this in place, in case there are
1423             // any pointers from the heap into it:
1424                 // #ifdef mingw32_HOST_OS
1425                 //  VirtualFree(oc->image);
1426                 // #else
1427             //  stgFree(oc->image);
1428             // #endif
1429             stgFree(oc->fileName);
1430             stgFree(oc->symbols);
1431             stgFree(oc->sections);
1432             /* The local hash table should have been freed at the end
1433                of the ocResolve_ call on it. */
1434             ASSERT(oc->lochash == NULL);
1435             stgFree(oc);
1436             return 1;
1437         }
1438     }
1439
1440     errorBelch("unloadObj: can't find `%s' to unload", path);
1441     return 0;
1442 }
1443
1444 /* -----------------------------------------------------------------------------
1445  * Sanity checking.  For each ObjectCode, maintain a list of address ranges
1446  * which may be prodded during relocation, and abort if we try and write
1447  * outside any of these.
1448  */
1449 static void addProddableBlock ( ObjectCode* oc, void* start, int size )
1450 {
1451    ProddableBlock* pb
1452       = stgMallocBytes(sizeof(ProddableBlock), "addProddableBlock");
1453    /* debugBelch("aPB %p %p %d\n", oc, start, size); */
1454    ASSERT(size > 0);
1455    pb->start      = start;
1456    pb->size       = size;
1457    pb->next       = oc->proddables;
1458    oc->proddables = pb;
1459 }
1460
1461 static void checkProddableBlock ( ObjectCode* oc, void* addr )
1462 {
1463    ProddableBlock* pb;
1464    for (pb = oc->proddables; pb != NULL; pb = pb->next) {
1465       char* s = (char*)(pb->start);
1466       char* e = s + pb->size - 1;
1467       char* a = (char*)addr;
1468       /* Assumes that the biggest fixup involves a 4-byte write.  This
1469          probably needs to be changed to 8 (ie, +7) on 64-bit
1470          plats. */
1471       if (a >= s && (a+3) <= e) return;
1472    }
1473    barf("checkProddableBlock: invalid fixup in runtime linker");
1474 }
1475
1476 /* -----------------------------------------------------------------------------
1477  * Section management.
1478  */
1479 static void addSection ( ObjectCode* oc, SectionKind kind,
1480                          void* start, void* end )
1481 {
1482    Section* s   = stgMallocBytes(sizeof(Section), "addSection");
1483    s->start     = start;
1484    s->end       = end;
1485    s->kind      = kind;
1486    s->next      = oc->sections;
1487    oc->sections = s;
1488    /*
1489    debugBelch("addSection: %p-%p (size %d), kind %d\n",
1490                    start, ((char*)end)-1, end - start + 1, kind );
1491    */
1492 }
1493
1494
1495 /* --------------------------------------------------------------------------
1496  * Symbol Extras.
1497  * This is about allocating a small chunk of memory for every symbol in the
1498  * object file. We make sure that the SymboLExtras are always "in range" of
1499  * limited-range PC-relative instructions on various platforms by allocating
1500  * them right next to the object code itself.
1501  */
1502
1503 #if defined(powerpc_HOST_ARCH) || (defined(x86_64_HOST_ARCH) \
1504                                     && defined(darwin_TARGET_OS))
1505
1506 /*
1507   ocAllocateSymbolExtras
1508
1509   Allocate additional space at the end of the object file image to make room
1510   for jump islands (powerpc, x86_64) and GOT entries (x86_64).
1511   
1512   PowerPC relative branch instructions have a 24 bit displacement field.
1513   As PPC code is always 4-byte-aligned, this yields a +-32MB range.
1514   If a particular imported symbol is outside this range, we have to redirect
1515   the jump to a short piece of new code that just loads the 32bit absolute
1516   address and jumps there.
1517   On x86_64, PC-relative jumps and PC-relative accesses to the GOT are limited
1518   to 32 bits (+-2GB).
1519   
1520   This function just allocates space for one SymbolExtra for every
1521   undefined symbol in the object file. The code for the jump islands is
1522   filled in by makeSymbolExtra below.
1523 */
1524
1525 static int ocAllocateSymbolExtras( ObjectCode* oc, int count, int first )
1526 {
1527 #ifdef USE_MMAP
1528   int pagesize, n, m;
1529 #endif
1530   int aligned;
1531   int misalignment = 0;
1532 #if darwin_HOST_OS
1533   misalignment = oc->misalignment;
1534 #endif
1535
1536   if( count > 0 )
1537   {
1538     // round up to the nearest 4
1539     aligned = (oc->fileSize + 3) & ~3;
1540
1541 #ifdef USE_MMAP
1542     #ifndef linux_HOST_OS /* mremap is a linux extension */
1543         #error ocAllocateSymbolExtras doesnt want USE_MMAP to be defined
1544     #endif
1545
1546     pagesize = getpagesize();
1547     n = ROUND_UP( oc->fileSize, pagesize );
1548     m = ROUND_UP( aligned + sizeof (SymbolExtra) * count, pagesize );
1549
1550     /* If we have a half-page-size file and map one page of it then
1551      * the part of the page after the size of the file remains accessible.
1552      * If, however, we map in 2 pages, the 2nd page is not accessible
1553      * and will give a "Bus Error" on access.  To get around this, we check
1554      * if we need any extra pages for the jump islands and map them in
1555      * anonymously.  We must check that we actually require extra pages
1556      * otherwise the attempt to mmap 0 pages of anonymous memory will
1557      * fail -EINVAL.
1558      */
1559
1560     if( m > n )
1561     {
1562       /* The effect of this mremap() call is only the ensure that we have
1563        * a sufficient number of virtually contiguous pages.  As returned from
1564        * mremap, the pages past the end of the file are not backed.  We give
1565        * them a backing by using MAP_FIXED to map in anonymous pages.
1566        */
1567       oc->image = mremap( oc->image, n, m, MREMAP_MAYMOVE );
1568
1569       if( oc->image == MAP_FAILED )
1570       {
1571         errorBelch( "Unable to mremap for Jump Islands\n" );
1572         return 0;
1573       }
1574
1575       if( mmap( oc->image + n, m - n, PROT_READ | PROT_WRITE | PROT_EXEC,
1576                 MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0 ) == MAP_FAILED )
1577       {
1578         errorBelch( "Unable to mmap( MAP_FIXED ) for Jump Islands\n" );
1579         return 0;
1580       }
1581     }
1582
1583 #else
1584     oc->image -= misalignment;
1585     oc->image = stgReallocBytes( oc->image,
1586                                  misalignment + 
1587                                  aligned + sizeof (SymbolExtra) * count,
1588                                  "ocAllocateSymbolExtras" );
1589     oc->image += misalignment;
1590 #endif /* USE_MMAP */
1591
1592     oc->symbol_extras = (SymbolExtra *) (oc->image + aligned);
1593     memset( oc->symbol_extras, 0, sizeof (SymbolExtra) * count );
1594   }
1595   else
1596     oc->symbol_extras = NULL;
1597
1598   oc->first_symbol_extra = first;
1599   oc->n_symbol_extras = count;
1600
1601   return 1;
1602 }
1603
1604 static SymbolExtra* makeSymbolExtra( ObjectCode* oc,
1605                                      unsigned long symbolNumber,
1606                                      unsigned long target )
1607 {
1608   SymbolExtra *extra;
1609
1610   ASSERT( symbolNumber >= oc->first_symbol_extra
1611         && symbolNumber - oc->first_symbol_extra < oc->n_symbol_extras);
1612
1613   extra = &oc->symbol_extras[symbolNumber - oc->first_symbol_extra];
1614
1615 #ifdef powerpc_HOST_ARCH
1616   // lis r12, hi16(target)
1617   extra->jumpIsland.lis_r12     = 0x3d80;
1618   extra->jumpIsland.hi_addr     = target >> 16;
1619
1620   // ori r12, r12, lo16(target)
1621   extra->jumpIsland.ori_r12_r12 = 0x618c;
1622   extra->jumpIsland.lo_addr     = target & 0xffff;
1623
1624   // mtctr r12
1625   extra->jumpIsland.mtctr_r12   = 0x7d8903a6;
1626
1627   // bctr
1628   extra->jumpIsland.bctr        = 0x4e800420;
1629 #endif
1630 #ifdef x86_64_HOST_ARCH
1631         // jmp *-14(%rip)
1632   static uint8_t jmp[] = { 0xFF, 0x25, 0xF2, 0xFF, 0xFF, 0xFF };
1633   extra->addr = target;
1634   memcpy(extra->jumpIsland, jmp, 6);
1635 #endif
1636     
1637   return extra;
1638 }
1639
1640 #endif
1641
1642 /* --------------------------------------------------------------------------
1643  * PowerPC specifics (instruction cache flushing)
1644  * ------------------------------------------------------------------------*/
1645
1646 #ifdef powerpc_TARGET_ARCH
1647 /*
1648    ocFlushInstructionCache
1649
1650    Flush the data & instruction caches.
1651    Because the PPC has split data/instruction caches, we have to
1652    do that whenever we modify code at runtime.
1653  */
1654
1655 static void ocFlushInstructionCache( ObjectCode *oc )
1656 {
1657     int n = (oc->fileSize + sizeof( SymbolExtra ) * oc->n_symbol_extras + 3) / 4;
1658     unsigned long *p = (unsigned long *) oc->image;
1659
1660     while( n-- )
1661     {
1662         __asm__ volatile ( "dcbf 0,%0\n\t"
1663                            "sync\n\t"
1664                            "icbi 0,%0"
1665                            :
1666                            : "r" (p)
1667                          );
1668         p++;
1669     }
1670     __asm__ volatile ( "sync\n\t"
1671                        "isync"
1672                      );
1673 }
1674 #endif
1675
1676 /* --------------------------------------------------------------------------
1677  * PEi386 specifics (Win32 targets)
1678  * ------------------------------------------------------------------------*/
1679
1680 /* The information for this linker comes from
1681       Microsoft Portable Executable
1682       and Common Object File Format Specification
1683       revision 5.1 January 1998
1684    which SimonM says comes from the MS Developer Network CDs.
1685
1686    It can be found there (on older CDs), but can also be found
1687    online at:
1688
1689       http://www.microsoft.com/hwdev/hardware/PECOFF.asp
1690
1691    (this is Rev 6.0 from February 1999).
1692
1693    Things move, so if that fails, try searching for it via
1694
1695       http://www.google.com/search?q=PE+COFF+specification
1696
1697    The ultimate reference for the PE format is the Winnt.h
1698    header file that comes with the Platform SDKs; as always,
1699    implementations will drift wrt their documentation.
1700
1701    A good background article on the PE format is Matt Pietrek's
1702    March 1994 article in Microsoft System Journal (MSJ)
1703    (Vol.9, No. 3): "Peering Inside the PE: A Tour of the
1704    Win32 Portable Executable File Format." The info in there
1705    has recently been updated in a two part article in
1706    MSDN magazine, issues Feb and March 2002,
1707    "Inside Windows: An In-Depth Look into the Win32 Portable
1708    Executable File Format"
1709
1710    John Levine's book "Linkers and Loaders" contains useful
1711    info on PE too.
1712 */
1713
1714
1715 #if defined(OBJFORMAT_PEi386)
1716
1717
1718
1719 typedef unsigned char  UChar;
1720 typedef unsigned short UInt16;
1721 typedef unsigned int   UInt32;
1722 typedef          int   Int32;
1723
1724
1725 typedef
1726    struct {
1727       UInt16 Machine;
1728       UInt16 NumberOfSections;
1729       UInt32 TimeDateStamp;
1730       UInt32 PointerToSymbolTable;
1731       UInt32 NumberOfSymbols;
1732       UInt16 SizeOfOptionalHeader;
1733       UInt16 Characteristics;
1734    }
1735    COFF_header;
1736
1737 #define sizeof_COFF_header 20
1738
1739
1740 typedef
1741    struct {
1742       UChar  Name[8];
1743       UInt32 VirtualSize;
1744       UInt32 VirtualAddress;
1745       UInt32 SizeOfRawData;
1746       UInt32 PointerToRawData;
1747       UInt32 PointerToRelocations;
1748       UInt32 PointerToLinenumbers;
1749       UInt16 NumberOfRelocations;
1750       UInt16 NumberOfLineNumbers;
1751       UInt32 Characteristics;
1752    }
1753    COFF_section;
1754
1755 #define sizeof_COFF_section 40
1756
1757
1758 typedef
1759    struct {
1760       UChar  Name[8];
1761       UInt32 Value;
1762       UInt16 SectionNumber;
1763       UInt16 Type;
1764       UChar  StorageClass;
1765       UChar  NumberOfAuxSymbols;
1766    }
1767    COFF_symbol;
1768
1769 #define sizeof_COFF_symbol 18
1770
1771
1772 typedef
1773    struct {
1774       UInt32 VirtualAddress;
1775       UInt32 SymbolTableIndex;
1776       UInt16 Type;
1777    }
1778    COFF_reloc;
1779
1780 #define sizeof_COFF_reloc 10
1781
1782
1783 /* From PE spec doc, section 3.3.2 */
1784 /* Note use of MYIMAGE_* since IMAGE_* are already defined in
1785    windows.h -- for the same purpose, but I want to know what I'm
1786    getting, here. */
1787 #define MYIMAGE_FILE_RELOCS_STRIPPED     0x0001
1788 #define MYIMAGE_FILE_EXECUTABLE_IMAGE    0x0002
1789 #define MYIMAGE_FILE_DLL                 0x2000
1790 #define MYIMAGE_FILE_SYSTEM              0x1000
1791 #define MYIMAGE_FILE_BYTES_REVERSED_HI   0x8000
1792 #define MYIMAGE_FILE_BYTES_REVERSED_LO   0x0080
1793 #define MYIMAGE_FILE_32BIT_MACHINE       0x0100
1794
1795 /* From PE spec doc, section 5.4.2 and 5.4.4 */
1796 #define MYIMAGE_SYM_CLASS_EXTERNAL       2
1797 #define MYIMAGE_SYM_CLASS_STATIC         3
1798 #define MYIMAGE_SYM_UNDEFINED            0
1799
1800 /* From PE spec doc, section 4.1 */
1801 #define MYIMAGE_SCN_CNT_CODE             0x00000020
1802 #define MYIMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
1803 #define MYIMAGE_SCN_LNK_NRELOC_OVFL      0x01000000
1804
1805 /* From PE spec doc, section 5.2.1 */
1806 #define MYIMAGE_REL_I386_DIR32           0x0006
1807 #define MYIMAGE_REL_I386_REL32           0x0014
1808
1809
1810 /* We use myindex to calculate array addresses, rather than
1811    simply doing the normal subscript thing.  That's because
1812    some of the above structs have sizes which are not
1813    a whole number of words.  GCC rounds their sizes up to a
1814    whole number of words, which means that the address calcs
1815    arising from using normal C indexing or pointer arithmetic
1816    are just plain wrong.  Sigh.
1817 */
1818 static UChar *
1819 myindex ( int scale, void* base, int index )
1820 {
1821    return
1822       ((UChar*)base) + scale * index;
1823 }
1824
1825
1826 static void
1827 printName ( UChar* name, UChar* strtab )
1828 {
1829    if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1830       UInt32 strtab_offset = * (UInt32*)(name+4);
1831       debugBelch("%s", strtab + strtab_offset );
1832    } else {
1833       int i;
1834       for (i = 0; i < 8; i++) {
1835          if (name[i] == 0) break;
1836          debugBelch("%c", name[i] );
1837       }
1838    }
1839 }
1840
1841
1842 static void
1843 copyName ( UChar* name, UChar* strtab, UChar* dst, int dstSize )
1844 {
1845    if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1846       UInt32 strtab_offset = * (UInt32*)(name+4);
1847       strncpy ( dst, strtab+strtab_offset, dstSize );
1848       dst[dstSize-1] = 0;
1849    } else {
1850       int i = 0;
1851       while (1) {
1852          if (i >= 8) break;
1853          if (name[i] == 0) break;
1854          dst[i] = name[i];
1855          i++;
1856       }
1857       dst[i] = 0;
1858    }
1859 }
1860
1861
1862 static UChar *
1863 cstring_from_COFF_symbol_name ( UChar* name, UChar* strtab )
1864 {
1865    UChar* newstr;
1866    /* If the string is longer than 8 bytes, look in the
1867       string table for it -- this will be correctly zero terminated.
1868    */
1869    if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1870       UInt32 strtab_offset = * (UInt32*)(name+4);
1871       return ((UChar*)strtab) + strtab_offset;
1872    }
1873    /* Otherwise, if shorter than 8 bytes, return the original,
1874       which by defn is correctly terminated.
1875    */
1876    if (name[7]==0) return name;
1877    /* The annoying case: 8 bytes.  Copy into a temporary
1878       (which is never freed ...)
1879    */
1880    newstr = stgMallocBytes(9, "cstring_from_COFF_symbol_name");
1881    ASSERT(newstr);
1882    strncpy(newstr,name,8);
1883    newstr[8] = 0;
1884    return newstr;
1885 }
1886
1887
1888 /* Just compares the short names (first 8 chars) */
1889 static COFF_section *
1890 findPEi386SectionCalled ( ObjectCode* oc,  char* name )
1891 {
1892    int i;
1893    COFF_header* hdr
1894       = (COFF_header*)(oc->image);
1895    COFF_section* sectab
1896       = (COFF_section*) (
1897            ((UChar*)(oc->image))
1898            + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1899         );
1900    for (i = 0; i < hdr->NumberOfSections; i++) {
1901       UChar* n1;
1902       UChar* n2;
1903       COFF_section* section_i
1904          = (COFF_section*)
1905            myindex ( sizeof_COFF_section, sectab, i );
1906       n1 = (UChar*) &(section_i->Name);
1907       n2 = name;
1908       if (n1[0]==n2[0] && n1[1]==n2[1] && n1[2]==n2[2] &&
1909           n1[3]==n2[3] && n1[4]==n2[4] && n1[5]==n2[5] &&
1910           n1[6]==n2[6] && n1[7]==n2[7])
1911          return section_i;
1912    }
1913
1914    return NULL;
1915 }
1916
1917
1918 static void
1919 zapTrailingAtSign ( UChar* sym )
1920 {
1921 #  define my_isdigit(c) ((c) >= '0' && (c) <= '9')
1922    int i, j;
1923    if (sym[0] == 0) return;
1924    i = 0;
1925    while (sym[i] != 0) i++;
1926    i--;
1927    j = i;
1928    while (j > 0 && my_isdigit(sym[j])) j--;
1929    if (j > 0 && sym[j] == '@' && j != i) sym[j] = 0;
1930 #  undef my_isdigit
1931 }
1932
1933
1934 static int
1935 ocVerifyImage_PEi386 ( ObjectCode* oc )
1936 {
1937    int i;
1938    UInt32 j, noRelocs;
1939    COFF_header*  hdr;
1940    COFF_section* sectab;
1941    COFF_symbol*  symtab;
1942    UChar*        strtab;
1943    /* debugBelch("\nLOADING %s\n", oc->fileName); */
1944    hdr = (COFF_header*)(oc->image);
1945    sectab = (COFF_section*) (
1946                ((UChar*)(oc->image))
1947                + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1948             );
1949    symtab = (COFF_symbol*) (
1950                ((UChar*)(oc->image))
1951                + hdr->PointerToSymbolTable
1952             );
1953    strtab = ((UChar*)symtab)
1954             + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1955
1956    if (hdr->Machine != 0x14c) {
1957       errorBelch("%s: Not x86 PEi386", oc->fileName);
1958       return 0;
1959    }
1960    if (hdr->SizeOfOptionalHeader != 0) {
1961       errorBelch("%s: PEi386 with nonempty optional header", oc->fileName);
1962       return 0;
1963    }
1964    if ( /* (hdr->Characteristics & MYIMAGE_FILE_RELOCS_STRIPPED) || */
1965         (hdr->Characteristics & MYIMAGE_FILE_EXECUTABLE_IMAGE) ||
1966         (hdr->Characteristics & MYIMAGE_FILE_DLL) ||
1967         (hdr->Characteristics & MYIMAGE_FILE_SYSTEM) ) {
1968       errorBelch("%s: Not a PEi386 object file", oc->fileName);
1969       return 0;
1970    }
1971    if ( (hdr->Characteristics & MYIMAGE_FILE_BYTES_REVERSED_HI)
1972         /* || !(hdr->Characteristics & MYIMAGE_FILE_32BIT_MACHINE) */ ) {
1973       errorBelch("%s: Invalid PEi386 word size or endiannness: %d",
1974                  oc->fileName,
1975                  (int)(hdr->Characteristics));
1976       return 0;
1977    }
1978    /* If the string table size is way crazy, this might indicate that
1979       there are more than 64k relocations, despite claims to the
1980       contrary.  Hence this test. */
1981    /* debugBelch("strtab size %d\n", * (UInt32*)strtab); */
1982 #if 0
1983    if ( (*(UInt32*)strtab) > 600000 ) {
1984       /* Note that 600k has no special significance other than being
1985          big enough to handle the almost-2MB-sized lumps that
1986          constitute HSwin32*.o. */
1987       debugBelch("PEi386 object has suspiciously large string table; > 64k relocs?");
1988       return 0;
1989    }
1990 #endif
1991
1992    /* No further verification after this point; only debug printing. */
1993    i = 0;
1994    IF_DEBUG(linker, i=1);
1995    if (i == 0) return 1;
1996
1997    debugBelch( "sectab offset = %d\n", ((UChar*)sectab) - ((UChar*)hdr) );
1998    debugBelch( "symtab offset = %d\n", ((UChar*)symtab) - ((UChar*)hdr) );
1999    debugBelch( "strtab offset = %d\n", ((UChar*)strtab) - ((UChar*)hdr) );
2000
2001    debugBelch("\n" );
2002    debugBelch( "Machine:           0x%x\n", (UInt32)(hdr->Machine) );
2003    debugBelch( "# sections:        %d\n",   (UInt32)(hdr->NumberOfSections) );
2004    debugBelch( "time/date:         0x%x\n", (UInt32)(hdr->TimeDateStamp) );
2005    debugBelch( "symtab offset:     %d\n",   (UInt32)(hdr->PointerToSymbolTable) );
2006    debugBelch( "# symbols:         %d\n",   (UInt32)(hdr->NumberOfSymbols) );
2007    debugBelch( "sz of opt hdr:     %d\n",   (UInt32)(hdr->SizeOfOptionalHeader) );
2008    debugBelch( "characteristics:   0x%x\n", (UInt32)(hdr->Characteristics) );
2009
2010    /* Print the section table. */
2011    debugBelch("\n" );
2012    for (i = 0; i < hdr->NumberOfSections; i++) {
2013       COFF_reloc* reltab;
2014       COFF_section* sectab_i
2015          = (COFF_section*)
2016            myindex ( sizeof_COFF_section, sectab, i );
2017       debugBelch(
2018                 "\n"
2019                 "section %d\n"
2020                 "     name `",
2021                 i
2022               );
2023       printName ( sectab_i->Name, strtab );
2024       debugBelch(
2025                 "'\n"
2026                 "    vsize %d\n"
2027                 "    vaddr %d\n"
2028                 "  data sz %d\n"
2029                 " data off %d\n"
2030                 "  num rel %d\n"
2031                 "  off rel %d\n"
2032                 "  ptr raw 0x%x\n",
2033                 sectab_i->VirtualSize,
2034                 sectab_i->VirtualAddress,
2035                 sectab_i->SizeOfRawData,
2036                 sectab_i->PointerToRawData,
2037                 sectab_i->NumberOfRelocations,
2038                 sectab_i->PointerToRelocations,
2039                 sectab_i->PointerToRawData
2040               );
2041       reltab = (COFF_reloc*) (
2042                   ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
2043                );
2044
2045       if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
2046         /* If the relocation field (a short) has overflowed, the
2047          * real count can be found in the first reloc entry.
2048          *
2049          * See Section 4.1 (last para) of the PE spec (rev6.0).
2050          */
2051         COFF_reloc* rel = (COFF_reloc*)
2052                            myindex ( sizeof_COFF_reloc, reltab, 0 );
2053         noRelocs = rel->VirtualAddress;
2054         j = 1;
2055       } else {
2056         noRelocs = sectab_i->NumberOfRelocations;
2057         j = 0;
2058       }
2059
2060       for (; j < noRelocs; j++) {
2061          COFF_symbol* sym;
2062          COFF_reloc* rel = (COFF_reloc*)
2063                            myindex ( sizeof_COFF_reloc, reltab, j );
2064          debugBelch(
2065                    "        type 0x%-4x   vaddr 0x%-8x   name `",
2066                    (UInt32)rel->Type,
2067                    rel->VirtualAddress );
2068          sym = (COFF_symbol*)
2069                myindex ( sizeof_COFF_symbol, symtab, rel->SymbolTableIndex );
2070          /* Hmm..mysterious looking offset - what's it for? SOF */
2071          printName ( sym->Name, strtab -10 );
2072          debugBelch("'\n" );
2073       }
2074
2075       debugBelch("\n" );
2076    }
2077    debugBelch("\n" );
2078    debugBelch("string table has size 0x%x\n", * (UInt32*)strtab );
2079    debugBelch("---START of string table---\n");
2080    for (i = 4; i < *(Int32*)strtab; i++) {
2081       if (strtab[i] == 0)
2082          debugBelch("\n"); else
2083          debugBelch("%c", strtab[i] );
2084    }
2085    debugBelch("--- END  of string table---\n");
2086
2087    debugBelch("\n" );
2088    i = 0;
2089    while (1) {
2090       COFF_symbol* symtab_i;
2091       if (i >= (Int32)(hdr->NumberOfSymbols)) break;
2092       symtab_i = (COFF_symbol*)
2093                  myindex ( sizeof_COFF_symbol, symtab, i );
2094       debugBelch(
2095                 "symbol %d\n"
2096                 "     name `",
2097                 i
2098               );
2099       printName ( symtab_i->Name, strtab );
2100       debugBelch(
2101                 "'\n"
2102                 "    value 0x%x\n"
2103                 "   1+sec# %d\n"
2104                 "     type 0x%x\n"
2105                 "   sclass 0x%x\n"
2106                 "     nAux %d\n",
2107                 symtab_i->Value,
2108                 (Int32)(symtab_i->SectionNumber),
2109                 (UInt32)symtab_i->Type,
2110                 (UInt32)symtab_i->StorageClass,
2111                 (UInt32)symtab_i->NumberOfAuxSymbols
2112               );
2113       i += symtab_i->NumberOfAuxSymbols;
2114       i++;
2115    }
2116
2117    debugBelch("\n" );
2118    return 1;
2119 }
2120
2121
2122 static int
2123 ocGetNames_PEi386 ( ObjectCode* oc )
2124 {
2125    COFF_header*  hdr;
2126    COFF_section* sectab;
2127    COFF_symbol*  symtab;
2128    UChar*        strtab;
2129
2130    UChar* sname;
2131    void*  addr;
2132    int    i;
2133
2134    hdr = (COFF_header*)(oc->image);
2135    sectab = (COFF_section*) (
2136                ((UChar*)(oc->image))
2137                + sizeof_COFF_header + hdr->SizeOfOptionalHeader
2138             );
2139    symtab = (COFF_symbol*) (
2140                ((UChar*)(oc->image))
2141                + hdr->PointerToSymbolTable
2142             );
2143    strtab = ((UChar*)(oc->image))
2144             + hdr->PointerToSymbolTable
2145             + hdr->NumberOfSymbols * sizeof_COFF_symbol;
2146
2147    /* Allocate space for any (local, anonymous) .bss sections. */
2148
2149    for (i = 0; i < hdr->NumberOfSections; i++) {
2150       UInt32 bss_sz;
2151       UChar* zspace;
2152       COFF_section* sectab_i
2153          = (COFF_section*)
2154            myindex ( sizeof_COFF_section, sectab, i );
2155       if (0 != strcmp(sectab_i->Name, ".bss")) continue;
2156       /* sof 10/05: the PE spec text isn't too clear regarding what
2157        * the SizeOfRawData field is supposed to hold for object
2158        * file sections containing just uninitialized data -- for executables,
2159        * it is supposed to be zero; unclear what it's supposed to be
2160        * for object files. However, VirtualSize is guaranteed to be
2161        * zero for object files, which definitely suggests that SizeOfRawData
2162        * will be non-zero (where else would the size of this .bss section be
2163        * stored?) Looking at the COFF_section info for incoming object files,
2164        * this certainly appears to be the case.
2165        *
2166        * => I suspect we've been incorrectly handling .bss sections in (relocatable)
2167        * object files up until now. This turned out to bite us with ghc-6.4.1's use
2168        * of gcc-3.4.x, which has started to emit initially-zeroed-out local 'static'
2169        * variable decls into to the .bss section. (The specific function in Q which
2170        * triggered this is libraries/base/cbits/dirUtils.c:__hscore_getFolderPath())
2171        */
2172       if (sectab_i->VirtualSize == 0 && sectab_i->SizeOfRawData == 0) continue;
2173       /* This is a non-empty .bss section.  Allocate zeroed space for
2174          it, and set its PointerToRawData field such that oc->image +
2175          PointerToRawData == addr_of_zeroed_space.  */
2176       bss_sz = sectab_i->VirtualSize;
2177       if ( bss_sz < sectab_i->SizeOfRawData) { bss_sz = sectab_i->SizeOfRawData; }
2178       zspace = stgCallocBytes(1, bss_sz, "ocGetNames_PEi386(anonymous bss)");
2179       sectab_i->PointerToRawData = ((UChar*)zspace) - ((UChar*)(oc->image));
2180       addProddableBlock(oc, zspace, bss_sz);
2181       /* debugBelch("BSS anon section at 0x%x\n", zspace); */
2182    }
2183
2184    /* Copy section information into the ObjectCode. */
2185
2186    for (i = 0; i < hdr->NumberOfSections; i++) {
2187       UChar* start;
2188       UChar* end;
2189       UInt32 sz;
2190
2191       SectionKind kind
2192          = SECTIONKIND_OTHER;
2193       COFF_section* sectab_i
2194          = (COFF_section*)
2195            myindex ( sizeof_COFF_section, sectab, i );
2196       IF_DEBUG(linker, debugBelch("section name = %s\n", sectab_i->Name ));
2197
2198 #     if 0
2199       /* I'm sure this is the Right Way to do it.  However, the
2200          alternative of testing the sectab_i->Name field seems to
2201          work ok with Cygwin.
2202       */
2203       if (sectab_i->Characteristics & MYIMAGE_SCN_CNT_CODE ||
2204           sectab_i->Characteristics & MYIMAGE_SCN_CNT_INITIALIZED_DATA)
2205          kind = SECTIONKIND_CODE_OR_RODATA;
2206 #     endif
2207
2208       if (0==strcmp(".text",sectab_i->Name) ||
2209           0==strcmp(".rdata",sectab_i->Name)||
2210           0==strcmp(".rodata",sectab_i->Name))
2211          kind = SECTIONKIND_CODE_OR_RODATA;
2212       if (0==strcmp(".data",sectab_i->Name) ||
2213           0==strcmp(".bss",sectab_i->Name))
2214          kind = SECTIONKIND_RWDATA;
2215
2216       ASSERT(sectab_i->SizeOfRawData == 0 || sectab_i->VirtualSize == 0);
2217       sz = sectab_i->SizeOfRawData;
2218       if (sz < sectab_i->VirtualSize) sz = sectab_i->VirtualSize;
2219
2220       start = ((UChar*)(oc->image)) + sectab_i->PointerToRawData;
2221       end   = start + sz - 1;
2222
2223       if (kind == SECTIONKIND_OTHER
2224           /* Ignore sections called which contain stabs debugging
2225              information. */
2226           && 0 != strcmp(".stab", sectab_i->Name)
2227           && 0 != strcmp(".stabstr", sectab_i->Name)
2228           /* ignore constructor section for now */
2229           && 0 != strcmp(".ctors", sectab_i->Name)
2230           /* ignore section generated from .ident */
2231           && 0!= strcmp("/4", sectab_i->Name)
2232          ) {
2233          errorBelch("Unknown PEi386 section name `%s' (while processing: %s)", sectab_i->Name, oc->fileName);
2234          return 0;
2235       }
2236
2237       if (kind != SECTIONKIND_OTHER && end >= start) {
2238          addSection(oc, kind, start, end);
2239          addProddableBlock(oc, start, end - start + 1);
2240       }
2241    }
2242
2243    /* Copy exported symbols into the ObjectCode. */
2244
2245    oc->n_symbols = hdr->NumberOfSymbols;
2246    oc->symbols   = stgMallocBytes(oc->n_symbols * sizeof(char*),
2247                                   "ocGetNames_PEi386(oc->symbols)");
2248    /* Call me paranoid; I don't care. */
2249    for (i = 0; i < oc->n_symbols; i++)
2250       oc->symbols[i] = NULL;
2251
2252    i = 0;
2253    while (1) {
2254       COFF_symbol* symtab_i;
2255       if (i >= (Int32)(hdr->NumberOfSymbols)) break;
2256       symtab_i = (COFF_symbol*)
2257                  myindex ( sizeof_COFF_symbol, symtab, i );
2258
2259       addr  = NULL;
2260
2261       if (symtab_i->StorageClass == MYIMAGE_SYM_CLASS_EXTERNAL
2262           && symtab_i->SectionNumber != MYIMAGE_SYM_UNDEFINED) {
2263          /* This symbol is global and defined, viz, exported */
2264          /* for MYIMAGE_SYMCLASS_EXTERNAL
2265                 && !MYIMAGE_SYM_UNDEFINED,
2266             the address of the symbol is:
2267                 address of relevant section + offset in section
2268          */
2269          COFF_section* sectabent
2270             = (COFF_section*) myindex ( sizeof_COFF_section,
2271                                         sectab,
2272                                         symtab_i->SectionNumber-1 );
2273          addr = ((UChar*)(oc->image))
2274                 + (sectabent->PointerToRawData
2275                    + symtab_i->Value);
2276       }
2277       else
2278       if (symtab_i->SectionNumber == MYIMAGE_SYM_UNDEFINED
2279           && symtab_i->Value > 0) {
2280          /* This symbol isn't in any section at all, ie, global bss.
2281             Allocate zeroed space for it. */
2282          addr = stgCallocBytes(1, symtab_i->Value,
2283                                "ocGetNames_PEi386(non-anonymous bss)");
2284          addSection(oc, SECTIONKIND_RWDATA, addr,
2285                         ((UChar*)addr) + symtab_i->Value - 1);
2286          addProddableBlock(oc, addr, symtab_i->Value);
2287          /* debugBelch("BSS      section at 0x%x\n", addr); */
2288       }
2289
2290       if (addr != NULL ) {
2291          sname = cstring_from_COFF_symbol_name ( symtab_i->Name, strtab );
2292          /* debugBelch("addSymbol %p `%s \n", addr,sname);  */
2293          IF_DEBUG(linker, debugBelch("addSymbol %p `%s'\n", addr,sname);)
2294          ASSERT(i >= 0 && i < oc->n_symbols);
2295          /* cstring_from_COFF_symbol_name always succeeds. */
2296          oc->symbols[i] = sname;
2297          ghciInsertStrHashTable(oc->fileName, symhash, sname, addr);
2298       } else {
2299 #        if 0
2300          debugBelch(
2301                    "IGNORING symbol %d\n"
2302                    "     name `",
2303                    i
2304                  );
2305          printName ( symtab_i->Name, strtab );
2306          debugBelch(
2307                    "'\n"
2308                    "    value 0x%x\n"
2309                    "   1+sec# %d\n"
2310                    "     type 0x%x\n"
2311                    "   sclass 0x%x\n"
2312                    "     nAux %d\n",
2313                    symtab_i->Value,
2314                    (Int32)(symtab_i->SectionNumber),
2315                    (UInt32)symtab_i->Type,
2316                    (UInt32)symtab_i->StorageClass,
2317                    (UInt32)symtab_i->NumberOfAuxSymbols
2318                  );
2319 #        endif
2320       }
2321
2322       i += symtab_i->NumberOfAuxSymbols;
2323       i++;
2324    }
2325
2326    return 1;
2327 }
2328
2329
2330 static int
2331 ocResolve_PEi386 ( ObjectCode* oc )
2332 {
2333    COFF_header*  hdr;
2334    COFF_section* sectab;
2335    COFF_symbol*  symtab;
2336    UChar*        strtab;
2337
2338    UInt32        A;
2339    UInt32        S;
2340    UInt32*       pP;
2341
2342    int i;
2343    UInt32 j, noRelocs;
2344
2345    /* ToDo: should be variable-sized?  But is at least safe in the
2346       sense of buffer-overrun-proof. */
2347    char symbol[1000];
2348    /* debugBelch("resolving for %s\n", oc->fileName); */
2349
2350    hdr = (COFF_header*)(oc->image);
2351    sectab = (COFF_section*) (
2352                ((UChar*)(oc->image))
2353                + sizeof_COFF_header + hdr->SizeOfOptionalHeader
2354             );
2355    symtab = (COFF_symbol*) (
2356                ((UChar*)(oc->image))
2357                + hdr->PointerToSymbolTable
2358             );
2359    strtab = ((UChar*)(oc->image))
2360             + hdr->PointerToSymbolTable
2361             + hdr->NumberOfSymbols * sizeof_COFF_symbol;
2362
2363    for (i = 0; i < hdr->NumberOfSections; i++) {
2364       COFF_section* sectab_i
2365          = (COFF_section*)
2366            myindex ( sizeof_COFF_section, sectab, i );
2367       COFF_reloc* reltab
2368          = (COFF_reloc*) (
2369               ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
2370            );
2371
2372       /* Ignore sections called which contain stabs debugging
2373          information. */
2374       if (0 == strcmp(".stab", sectab_i->Name)
2375           || 0 == strcmp(".stabstr", sectab_i->Name)
2376           || 0 == strcmp(".ctors", sectab_i->Name))
2377          continue;
2378
2379       if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
2380         /* If the relocation field (a short) has overflowed, the
2381          * real count can be found in the first reloc entry.
2382          *
2383          * See Section 4.1 (last para) of the PE spec (rev6.0).
2384          *
2385          * Nov2003 update: the GNU linker still doesn't correctly
2386          * handle the generation of relocatable object files with
2387          * overflown relocations. Hence the output to warn of potential
2388          * troubles.
2389          */
2390         COFF_reloc* rel = (COFF_reloc*)
2391                            myindex ( sizeof_COFF_reloc, reltab, 0 );
2392         noRelocs = rel->VirtualAddress;
2393
2394         /* 10/05: we now assume (and check for) a GNU ld that is capable
2395          * of handling object files with (>2^16) of relocs.
2396          */
2397 #if 0
2398         debugBelch("WARNING: Overflown relocation field (# relocs found: %u)\n",
2399                    noRelocs);
2400 #endif
2401         j = 1;
2402       } else {
2403         noRelocs = sectab_i->NumberOfRelocations;
2404         j = 0;
2405       }
2406
2407
2408       for (; j < noRelocs; j++) {
2409          COFF_symbol* sym;
2410          COFF_reloc* reltab_j
2411             = (COFF_reloc*)
2412               myindex ( sizeof_COFF_reloc, reltab, j );
2413
2414          /* the location to patch */
2415          pP = (UInt32*)(
2416                  ((UChar*)(oc->image))
2417                  + (sectab_i->PointerToRawData
2418                     + reltab_j->VirtualAddress
2419                     - sectab_i->VirtualAddress )
2420               );
2421          /* the existing contents of pP */
2422          A = *pP;
2423          /* the symbol to connect to */
2424          sym = (COFF_symbol*)
2425                myindex ( sizeof_COFF_symbol,
2426                          symtab, reltab_j->SymbolTableIndex );
2427          IF_DEBUG(linker,
2428                   debugBelch(
2429                             "reloc sec %2d num %3d:  type 0x%-4x   "
2430                             "vaddr 0x%-8x   name `",
2431                             i, j,
2432                             (UInt32)reltab_j->Type,
2433                             reltab_j->VirtualAddress );
2434                             printName ( sym->Name, strtab );
2435                             debugBelch("'\n" ));
2436
2437          if (sym->StorageClass == MYIMAGE_SYM_CLASS_STATIC) {
2438             COFF_section* section_sym
2439                = findPEi386SectionCalled ( oc, sym->Name );
2440             if (!section_sym) {
2441                errorBelch("%s: can't find section `%s'", oc->fileName, sym->Name);
2442                return 0;
2443             }
2444             S = ((UInt32)(oc->image))
2445                 + (section_sym->PointerToRawData
2446                    + sym->Value);
2447          } else {
2448             copyName ( sym->Name, strtab, symbol, 1000-1 );
2449             S = (UInt32) lookupLocalSymbol( oc, symbol );
2450             if ((void*)S != NULL) goto foundit;
2451             S = (UInt32) lookupSymbol( symbol );
2452             if ((void*)S != NULL) goto foundit;
2453             zapTrailingAtSign ( symbol );
2454             S = (UInt32) lookupLocalSymbol( oc, symbol );
2455             if ((void*)S != NULL) goto foundit;
2456             S = (UInt32) lookupSymbol( symbol );
2457             if ((void*)S != NULL) goto foundit;
2458             /* Newline first because the interactive linker has printed "linking..." */
2459             errorBelch("\n%s: unknown symbol `%s'", oc->fileName, symbol);
2460             return 0;
2461            foundit:;
2462          }
2463          checkProddableBlock(oc, pP);
2464          switch (reltab_j->Type) {
2465             case MYIMAGE_REL_I386_DIR32:
2466                *pP = A + S;
2467                break;
2468             case MYIMAGE_REL_I386_REL32:
2469                /* Tricky.  We have to insert a displacement at
2470                   pP which, when added to the PC for the _next_
2471                   insn, gives the address of the target (S).
2472                   Problem is to know the address of the next insn
2473                   when we only know pP.  We assume that this
2474                   literal field is always the last in the insn,
2475                   so that the address of the next insn is pP+4
2476                   -- hence the constant 4.
2477                   Also I don't know if A should be added, but so
2478                   far it has always been zero.
2479
2480                   SOF 05/2005: 'A' (old contents of *pP) have been observed
2481                   to contain values other than zero (the 'wx' object file
2482                   that came with wxhaskell-0.9.4; dunno how it was compiled..).
2483                   So, add displacement to old value instead of asserting
2484                   A to be zero. Fixes wxhaskell-related crashes, and no other
2485                   ill effects have been observed.
2486                   
2487                   Update: the reason why we're seeing these more elaborate
2488                   relocations is due to a switch in how the NCG compiles SRTs 
2489                   and offsets to them from info tables. SRTs live in .(ro)data, 
2490                   while info tables live in .text, causing GAS to emit REL32/DISP32 
2491                   relocations with non-zero values. Adding the displacement is
2492                   the right thing to do.
2493                */
2494                *pP = S - ((UInt32)pP) - 4 + A;
2495                break;
2496             default:
2497                debugBelch("%s: unhandled PEi386 relocation type %d",
2498                      oc->fileName, reltab_j->Type);
2499                return 0;
2500          }
2501
2502       }
2503    }
2504
2505    IF_DEBUG(linker, debugBelch("completed %s", oc->fileName));
2506    return 1;
2507 }
2508
2509 #endif /* defined(OBJFORMAT_PEi386) */
2510
2511
2512 /* --------------------------------------------------------------------------
2513  * ELF specifics
2514  * ------------------------------------------------------------------------*/
2515
2516 #if defined(OBJFORMAT_ELF)
2517
2518 #define FALSE 0
2519 #define TRUE  1
2520
2521 #if defined(sparc_HOST_ARCH)
2522 #  define ELF_TARGET_SPARC  /* Used inside <elf.h> */
2523 #elif defined(i386_HOST_ARCH)
2524 #  define ELF_TARGET_386    /* Used inside <elf.h> */
2525 #elif defined(x86_64_HOST_ARCH)
2526 #  define ELF_TARGET_X64_64
2527 #  define ELF_64BIT
2528 #elif defined (ia64_HOST_ARCH)
2529 #  define ELF_TARGET_IA64   /* Used inside <elf.h> */
2530 #  define ELF_64BIT
2531 #  define ELF_FUNCTION_DESC /* calling convention uses function descriptors */
2532 #  define ELF_NEED_GOT      /* needs Global Offset Table */
2533 #  define ELF_NEED_PLT      /* needs Procedure Linkage Tables */
2534 #endif
2535
2536 #if !defined(openbsd_HOST_OS)
2537 #include <elf.h>
2538 #else
2539 /* openbsd elf has things in different places, with diff names */
2540 #include <elf_abi.h>
2541 #include <machine/reloc.h>
2542 #define R_386_32    RELOC_32
2543 #define R_386_PC32  RELOC_PC32
2544 #endif
2545
2546 /*
2547  * Define a set of types which can be used for both ELF32 and ELF64
2548  */
2549
2550 #ifdef ELF_64BIT
2551 #define ELFCLASS    ELFCLASS64
2552 #define Elf_Addr    Elf64_Addr
2553 #define Elf_Word    Elf64_Word
2554 #define Elf_Sword   Elf64_Sword
2555 #define Elf_Ehdr    Elf64_Ehdr
2556 #define Elf_Phdr    Elf64_Phdr
2557 #define Elf_Shdr    Elf64_Shdr
2558 #define Elf_Sym     Elf64_Sym
2559 #define Elf_Rel     Elf64_Rel
2560 #define Elf_Rela    Elf64_Rela
2561 #define ELF_ST_TYPE ELF64_ST_TYPE
2562 #define ELF_ST_BIND ELF64_ST_BIND
2563 #define ELF_R_TYPE  ELF64_R_TYPE
2564 #define ELF_R_SYM   ELF64_R_SYM
2565 #else
2566 #define ELFCLASS    ELFCLASS32
2567 #define Elf_Addr    Elf32_Addr
2568 #define Elf_Word    Elf32_Word
2569 #define Elf_Sword   Elf32_Sword
2570 #define Elf_Ehdr    Elf32_Ehdr
2571 #define Elf_Phdr    Elf32_Phdr
2572 #define Elf_Shdr    Elf32_Shdr
2573 #define Elf_Sym     Elf32_Sym
2574 #define Elf_Rel     Elf32_Rel
2575 #define Elf_Rela    Elf32_Rela
2576 #ifndef ELF_ST_TYPE
2577 #define ELF_ST_TYPE ELF32_ST_TYPE
2578 #endif
2579 #ifndef ELF_ST_BIND
2580 #define ELF_ST_BIND ELF32_ST_BIND
2581 #endif
2582 #ifndef ELF_R_TYPE
2583 #define ELF_R_TYPE  ELF32_R_TYPE
2584 #endif
2585 #ifndef ELF_R_SYM
2586 #define ELF_R_SYM   ELF32_R_SYM
2587 #endif
2588 #endif
2589
2590
2591 /*
2592  * Functions to allocate entries in dynamic sections.  Currently we simply
2593  * preallocate a large number, and we don't check if a entry for the given
2594  * target already exists (a linear search is too slow).  Ideally these
2595  * entries would be associated with symbols.
2596  */
2597
2598 /* These sizes sufficient to load HSbase + HShaskell98 + a few modules */
2599 #define GOT_SIZE            0x20000
2600 #define FUNCTION_TABLE_SIZE 0x10000
2601 #define PLT_SIZE            0x08000
2602
2603 #ifdef ELF_NEED_GOT
2604 static Elf_Addr got[GOT_SIZE];
2605 static unsigned int gotIndex;
2606 static Elf_Addr gp_val = (Elf_Addr)got;
2607
2608 static Elf_Addr
2609 allocateGOTEntry(Elf_Addr target)
2610 {
2611    Elf_Addr *entry;
2612
2613    if (gotIndex >= GOT_SIZE)
2614       barf("Global offset table overflow");
2615
2616    entry = &got[gotIndex++];
2617    *entry = target;
2618    return (Elf_Addr)entry;
2619 }
2620 #endif
2621
2622 #ifdef ELF_FUNCTION_DESC
2623 typedef struct {
2624    Elf_Addr ip;
2625    Elf_Addr gp;
2626 } FunctionDesc;
2627
2628 static FunctionDesc functionTable[FUNCTION_TABLE_SIZE];
2629 static unsigned int functionTableIndex;
2630
2631 static Elf_Addr
2632 allocateFunctionDesc(Elf_Addr target)
2633 {
2634    FunctionDesc *entry;
2635
2636    if (functionTableIndex >= FUNCTION_TABLE_SIZE)
2637       barf("Function table overflow");
2638
2639    entry = &functionTable[functionTableIndex++];
2640    entry->ip = target;
2641    entry->gp = (Elf_Addr)gp_val;
2642    return (Elf_Addr)entry;
2643 }
2644
2645 static Elf_Addr
2646 copyFunctionDesc(Elf_Addr target)
2647 {
2648    FunctionDesc *olddesc = (FunctionDesc *)target;
2649    FunctionDesc *newdesc;
2650
2651    newdesc = (FunctionDesc *)allocateFunctionDesc(olddesc->ip);
2652    newdesc->gp = olddesc->gp;
2653    return (Elf_Addr)newdesc;
2654 }
2655 #endif
2656
2657 #ifdef ELF_NEED_PLT
2658 #ifdef ia64_HOST_ARCH
2659 static void ia64_reloc_gprel22(Elf_Addr target, Elf_Addr value);
2660 static void ia64_reloc_pcrel21(Elf_Addr target, Elf_Addr value, ObjectCode *oc);
2661
2662 static unsigned char plt_code[] =
2663 {
2664    /* taken from binutils bfd/elfxx-ia64.c */
2665    0x0b, 0x78, 0x00, 0x02, 0x00, 0x24,  /*   [MMI]       addl r15=0,r1;;    */
2666    0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0,  /*               ld8 r16=[r15],8    */
2667    0x01, 0x08, 0x00, 0x84,              /*               mov r14=r1;;       */
2668    0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,  /*   [MIB]       ld8 r1=[r15]       */
2669    0x60, 0x80, 0x04, 0x80, 0x03, 0x00,  /*               mov b6=r16         */
2670    0x60, 0x00, 0x80, 0x00               /*               br.few b6;;        */
2671 };
2672
2673 /* If we can't get to the function descriptor via gp, take a local copy of it */
2674 #define PLT_RELOC(code, target) { \
2675    Elf64_Sxword rel_value = target - gp_val; \
2676    if ((rel_value > 0x1fffff) || (rel_value < -0x1fffff)) \
2677       ia64_reloc_gprel22((Elf_Addr)code, copyFunctionDesc(target)); \
2678    else \
2679       ia64_reloc_gprel22((Elf_Addr)code, target); \
2680    }
2681 #endif
2682
2683 typedef struct {
2684    unsigned char code[sizeof(plt_code)];
2685 } PLTEntry;
2686
2687 static Elf_Addr
2688 allocatePLTEntry(Elf_Addr target, ObjectCode *oc)
2689 {
2690    PLTEntry *plt = (PLTEntry *)oc->plt;
2691    PLTEntry *entry;
2692
2693    if (oc->pltIndex >= PLT_SIZE)
2694       barf("Procedure table overflow");
2695
2696    entry = &plt[oc->pltIndex++];
2697    memcpy(entry->code, plt_code, sizeof(entry->code));
2698    PLT_RELOC(entry->code, target);
2699    return (Elf_Addr)entry;
2700 }
2701
2702 static unsigned int
2703 PLTSize(void)
2704 {
2705    return (PLT_SIZE * sizeof(PLTEntry));
2706 }
2707 #endif
2708
2709
2710 #if x86_64_HOST_ARCH
2711 // On x86_64, 32-bit relocations are often used, which requires that
2712 // we can resolve a symbol to a 32-bit offset.  However, shared
2713 // libraries are placed outside the 2Gb area, which leaves us with a
2714 // problem when we need to give a 32-bit offset to a symbol in a
2715 // shared library.
2716 // 
2717 // For a function symbol, we can allocate a bounce sequence inside the
2718 // 2Gb area and resolve the symbol to this.  The bounce sequence is
2719 // simply a long jump instruction to the real location of the symbol.
2720 //
2721 // For data references, we're screwed.
2722 //
2723 typedef struct {
2724     unsigned char jmp[8];  /* 6 byte instruction: jmpq *0x00000002(%rip) */
2725     void *addr;
2726 } x86_64_bounce;
2727
2728 #define X86_64_BB_SIZE 1024
2729
2730 static x86_64_bounce *x86_64_bounce_buffer = NULL;
2731 static nat x86_64_bb_next_off;
2732
2733 static void*
2734 x86_64_high_symbol( char *lbl, void *addr )
2735 {
2736     x86_64_bounce *bounce;
2737
2738     if ( x86_64_bounce_buffer == NULL || 
2739          x86_64_bb_next_off >= X86_64_BB_SIZE ) {
2740         x86_64_bounce_buffer = 
2741             mmap(NULL, X86_64_BB_SIZE * sizeof(x86_64_bounce), 
2742                  PROT_EXEC|PROT_READ|PROT_WRITE, 
2743                  MAP_PRIVATE|MAP_32BIT|MAP_ANONYMOUS, -1, 0);
2744         if (x86_64_bounce_buffer == MAP_FAILED) {
2745             barf("x86_64_high_symbol: mmap failed");
2746         }
2747         x86_64_bb_next_off = 0;
2748     }
2749     bounce = &x86_64_bounce_buffer[x86_64_bb_next_off];
2750     bounce->jmp[0] = 0xff;
2751     bounce->jmp[1] = 0x25;
2752     bounce->jmp[2] = 0x02;
2753     bounce->jmp[3] = 0x00;
2754     bounce->jmp[4] = 0x00;
2755     bounce->jmp[5] = 0x00;
2756     bounce->addr = addr;
2757     x86_64_bb_next_off++;
2758
2759     IF_DEBUG(linker, debugBelch("x86_64: allocated bounce entry for %s->%p at %p\n",
2760                                 lbl, addr, bounce));
2761
2762     insertStrHashTable(symhash, lbl, bounce);
2763     return bounce;
2764 }
2765 #endif
2766
2767
2768 /*
2769  * Generic ELF functions
2770  */
2771
2772 static char *
2773 findElfSection ( void* objImage, Elf_Word sh_type )
2774 {
2775    char* ehdrC = (char*)objImage;
2776    Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2777    Elf_Shdr* shdr = (Elf_Shdr*)(ehdrC + ehdr->e_shoff);
2778    char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
2779    char* ptr = NULL;
2780    int i;
2781
2782    for (i = 0; i < ehdr->e_shnum; i++) {
2783       if (shdr[i].sh_type == sh_type
2784           /* Ignore the section header's string table. */
2785           && i != ehdr->e_shstrndx
2786           /* Ignore string tables named .stabstr, as they contain
2787              debugging info. */
2788           && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
2789          ) {
2790          ptr = ehdrC + shdr[i].sh_offset;
2791          break;
2792       }
2793    }
2794    return ptr;
2795 }
2796
2797 #if defined(ia64_HOST_ARCH)
2798 static Elf_Addr
2799 findElfSegment ( void* objImage, Elf_Addr vaddr )
2800 {
2801    char* ehdrC = (char*)objImage;
2802    Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2803    Elf_Phdr* phdr = (Elf_Phdr*)(ehdrC + ehdr->e_phoff);
2804    Elf_Addr segaddr = 0;
2805    int i;
2806
2807    for (i = 0; i < ehdr->e_phnum; i++) {
2808       segaddr = phdr[i].p_vaddr;
2809       if ((vaddr >= segaddr) && (vaddr < segaddr + phdr[i].p_memsz))
2810               break;
2811    }
2812    return segaddr;
2813 }
2814 #endif
2815
2816 static int
2817 ocVerifyImage_ELF ( ObjectCode* oc )
2818 {
2819    Elf_Shdr* shdr;
2820    Elf_Sym*  stab;
2821    int i, j, nent, nstrtab, nsymtabs;
2822    char* sh_strtab;
2823    char* strtab;
2824
2825    char*     ehdrC = (char*)(oc->image);
2826    Elf_Ehdr* ehdr  = (Elf_Ehdr*)ehdrC;
2827
2828    if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
2829        ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
2830        ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
2831        ehdr->e_ident[EI_MAG3] != ELFMAG3) {
2832       errorBelch("%s: not an ELF object", oc->fileName);
2833       return 0;
2834    }
2835
2836    if (ehdr->e_ident[EI_CLASS] != ELFCLASS) {
2837       errorBelch("%s: unsupported ELF format", oc->fileName);
2838       return 0;
2839    }
2840
2841    if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
2842        IF_DEBUG(linker,debugBelch( "Is little-endian\n" ));
2843    } else
2844    if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
2845        IF_DEBUG(linker,debugBelch( "Is big-endian\n" ));
2846    } else {
2847        errorBelch("%s: unknown endiannness", oc->fileName);
2848        return 0;
2849    }
2850
2851    if (ehdr->e_type != ET_REL) {
2852       errorBelch("%s: not a relocatable object (.o) file", oc->fileName);
2853       return 0;
2854    }
2855    IF_DEBUG(linker, debugBelch( "Is a relocatable object (.o) file\n" ));
2856
2857    IF_DEBUG(linker,debugBelch( "Architecture is " ));
2858    switch (ehdr->e_machine) {
2859       case EM_386:   IF_DEBUG(linker,debugBelch( "x86" )); break;
2860 #ifdef EM_SPARC32PLUS
2861       case EM_SPARC32PLUS:
2862 #endif
2863       case EM_SPARC: IF_DEBUG(linker,debugBelch( "sparc" )); break;
2864 #ifdef EM_IA_64
2865       case EM_IA_64: IF_DEBUG(linker,debugBelch( "ia64" )); break;
2866 #endif
2867       case EM_PPC:   IF_DEBUG(linker,debugBelch( "powerpc32" )); break;
2868 #ifdef EM_X86_64
2869       case EM_X86_64: IF_DEBUG(linker,debugBelch( "x86_64" )); break;
2870 #endif
2871       default:       IF_DEBUG(linker,debugBelch( "unknown" ));
2872                      errorBelch("%s: unknown architecture", oc->fileName);
2873                      return 0;
2874    }
2875
2876    IF_DEBUG(linker,debugBelch(
2877              "\nSection header table: start %ld, n_entries %d, ent_size %d\n",
2878              (long)ehdr->e_shoff, ehdr->e_shnum, ehdr->e_shentsize  ));
2879
2880    ASSERT (ehdr->e_shentsize == sizeof(Elf_Shdr));
2881
2882    shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
2883
2884    if (ehdr->e_shstrndx == SHN_UNDEF) {
2885       errorBelch("%s: no section header string table", oc->fileName);
2886       return 0;
2887    } else {
2888       IF_DEBUG(linker,debugBelch( "Section header string table is section %d\n",
2889                           ehdr->e_shstrndx));
2890       sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
2891    }
2892
2893    for (i = 0; i < ehdr->e_shnum; i++) {
2894       IF_DEBUG(linker,debugBelch("%2d:  ", i ));
2895       IF_DEBUG(linker,debugBelch("type=%2d  ", (int)shdr[i].sh_type ));
2896       IF_DEBUG(linker,debugBelch("size=%4d  ", (int)shdr[i].sh_size ));
2897       IF_DEBUG(linker,debugBelch("offs=%4d  ", (int)shdr[i].sh_offset ));
2898       IF_DEBUG(linker,debugBelch("  (%p .. %p)  ",
2899                ehdrC + shdr[i].sh_offset,
2900                       ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1));
2901
2902       if (shdr[i].sh_type == SHT_REL) {
2903           IF_DEBUG(linker,debugBelch("Rel  " ));
2904       } else if (shdr[i].sh_type == SHT_RELA) {
2905           IF_DEBUG(linker,debugBelch("RelA " ));
2906       } else {
2907           IF_DEBUG(linker,debugBelch("     "));
2908       }
2909       if (sh_strtab) {
2910           IF_DEBUG(linker,debugBelch("sname=%s\n", sh_strtab + shdr[i].sh_name ));
2911       }
2912    }
2913
2914    IF_DEBUG(linker,debugBelch( "\nString tables" ));
2915    strtab = NULL;
2916    nstrtab = 0;
2917    for (i = 0; i < ehdr->e_shnum; i++) {
2918       if (shdr[i].sh_type == SHT_STRTAB
2919           /* Ignore the section header's string table. */
2920           && i != ehdr->e_shstrndx
2921           /* Ignore string tables named .stabstr, as they contain
2922              debugging info. */
2923           && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
2924          ) {
2925          IF_DEBUG(linker,debugBelch("   section %d is a normal string table", i ));
2926          strtab = ehdrC + shdr[i].sh_offset;
2927          nstrtab++;
2928       }
2929    }
2930    if (nstrtab != 1) {
2931       errorBelch("%s: no string tables, or too many", oc->fileName);
2932       return 0;
2933    }
2934
2935    nsymtabs = 0;
2936    IF_DEBUG(linker,debugBelch( "\nSymbol tables" ));
2937    for (i = 0; i < ehdr->e_shnum; i++) {
2938       if (shdr[i].sh_type != SHT_SYMTAB) continue;
2939       IF_DEBUG(linker,debugBelch( "section %d is a symbol table\n", i ));
2940       nsymtabs++;
2941       stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
2942       nent = shdr[i].sh_size / sizeof(Elf_Sym);
2943       IF_DEBUG(linker,debugBelch( "   number of entries is apparently %d (%ld rem)\n",
2944                nent,
2945                (long)shdr[i].sh_size % sizeof(Elf_Sym)
2946              ));
2947       if (0 != shdr[i].sh_size % sizeof(Elf_Sym)) {
2948          errorBelch("%s: non-integral number of symbol table entries", oc->fileName);
2949          return 0;
2950       }
2951       for (j = 0; j < nent; j++) {
2952          IF_DEBUG(linker,debugBelch("   %2d  ", j ));
2953          IF_DEBUG(linker,debugBelch("  sec=%-5d  size=%-3d  val=%5p  ",
2954                              (int)stab[j].st_shndx,
2955                              (int)stab[j].st_size,
2956                              (char*)stab[j].st_value ));
2957
2958          IF_DEBUG(linker,debugBelch("type=" ));
2959          switch (ELF_ST_TYPE(stab[j].st_info)) {
2960             case STT_NOTYPE:  IF_DEBUG(linker,debugBelch("notype " )); break;
2961             case STT_OBJECT:  IF_DEBUG(linker,debugBelch("object " )); break;
2962             case STT_FUNC  :  IF_DEBUG(linker,debugBelch("func   " )); break;
2963             case STT_SECTION: IF_DEBUG(linker,debugBelch("section" )); break;
2964             case STT_FILE:    IF_DEBUG(linker,debugBelch("file   " )); break;
2965             default:          IF_DEBUG(linker,debugBelch("?      " )); break;
2966          }
2967          IF_DEBUG(linker,debugBelch("  " ));
2968
2969          IF_DEBUG(linker,debugBelch("bind=" ));
2970          switch (ELF_ST_BIND(stab[j].st_info)) {
2971             case STB_LOCAL :  IF_DEBUG(linker,debugBelch("local " )); break;
2972             case STB_GLOBAL:  IF_DEBUG(linker,debugBelch("global" )); break;
2973             case STB_WEAK  :  IF_DEBUG(linker,debugBelch("weak  " )); break;
2974             default:          IF_DEBUG(linker,debugBelch("?     " )); break;
2975          }
2976          IF_DEBUG(linker,debugBelch("  " ));
2977
2978          IF_DEBUG(linker,debugBelch("name=%s\n", strtab + stab[j].st_name ));
2979       }
2980    }
2981
2982    if (nsymtabs == 0) {
2983       errorBelch("%s: didn't find any symbol tables", oc->fileName);
2984       return 0;
2985    }
2986
2987    return 1;
2988 }
2989
2990 static int getSectionKind_ELF( Elf_Shdr *hdr, int *is_bss )
2991 {
2992     *is_bss = FALSE;
2993
2994     if (hdr->sh_type == SHT_PROGBITS
2995         && (hdr->sh_flags & SHF_ALLOC) && (hdr->sh_flags & SHF_EXECINSTR)) {
2996         /* .text-style section */
2997         return SECTIONKIND_CODE_OR_RODATA;
2998     }
2999
3000     if (hdr->sh_type == SHT_PROGBITS
3001             && (hdr->sh_flags & SHF_ALLOC) && (hdr->sh_flags & SHF_WRITE)) {
3002             /* .data-style section */
3003             return SECTIONKIND_RWDATA;
3004     }
3005
3006     if (hdr->sh_type == SHT_PROGBITS
3007         && (hdr->sh_flags & SHF_ALLOC) && !(hdr->sh_flags & SHF_WRITE)) {
3008         /* .rodata-style section */
3009         return SECTIONKIND_CODE_OR_RODATA;
3010     }
3011
3012     if (hdr->sh_type == SHT_NOBITS
3013         && (hdr->sh_flags & SHF_ALLOC) && (hdr->sh_flags & SHF_WRITE)) {
3014         /* .bss-style section */
3015         *is_bss = TRUE;
3016         return SECTIONKIND_RWDATA;
3017     }
3018
3019     return SECTIONKIND_OTHER;
3020 }
3021
3022
3023 static int
3024 ocGetNames_ELF ( ObjectCode* oc )
3025 {
3026    int i, j, k, nent;
3027    Elf_Sym* stab;
3028
3029    char*     ehdrC    = (char*)(oc->image);
3030    Elf_Ehdr* ehdr     = (Elf_Ehdr*)ehdrC;
3031    char*     strtab   = findElfSection ( ehdrC, SHT_STRTAB );
3032    Elf_Shdr* shdr     = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
3033
3034    ASSERT(symhash != NULL);
3035
3036    if (!strtab) {
3037       errorBelch("%s: no strtab", oc->fileName);
3038       return 0;
3039    }
3040
3041    k = 0;
3042    for (i = 0; i < ehdr->e_shnum; i++) {
3043       /* Figure out what kind of section it is.  Logic derived from
3044          Figure 1.14 ("Special Sections") of the ELF document
3045          ("Portable Formats Specification, Version 1.1"). */
3046       int         is_bss = FALSE;
3047       SectionKind kind   = getSectionKind_ELF(&shdr[i], &is_bss);
3048
3049       if (is_bss && shdr[i].sh_size > 0) {
3050          /* This is a non-empty .bss section.  Allocate zeroed space for
3051             it, and set its .sh_offset field such that
3052             ehdrC + .sh_offset == addr_of_zeroed_space.  */
3053          char* zspace = stgCallocBytes(1, shdr[i].sh_size,
3054                                        "ocGetNames_ELF(BSS)");
3055          shdr[i].sh_offset = ((char*)zspace) - ((char*)ehdrC);
3056          /*
3057          debugBelch("BSS section at 0x%x, size %d\n",
3058                          zspace, shdr[i].sh_size);
3059          */
3060       }
3061
3062       /* fill in the section info */
3063       if (kind != SECTIONKIND_OTHER && shdr[i].sh_size > 0) {
3064          addProddableBlock(oc, ehdrC + shdr[i].sh_offset, shdr[i].sh_size);
3065          addSection(oc, kind, ehdrC + shdr[i].sh_offset,
3066                         ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1);
3067       }
3068
3069       if (shdr[i].sh_type != SHT_SYMTAB) continue;
3070
3071       /* copy stuff into this module's object symbol table */
3072       stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
3073       nent = shdr[i].sh_size / sizeof(Elf_Sym);
3074
3075       oc->n_symbols = nent;
3076       oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
3077                                    "ocGetNames_ELF(oc->symbols)");
3078
3079       for (j = 0; j < nent; j++) {
3080
3081          char  isLocal = FALSE; /* avoids uninit-var warning */
3082          char* ad      = NULL;
3083          char* nm      = strtab + stab[j].st_name;
3084          int   secno   = stab[j].st_shndx;
3085
3086          /* Figure out if we want to add it; if so, set ad to its
3087             address.  Otherwise leave ad == NULL. */
3088
3089          if (secno == SHN_COMMON) {
3090             isLocal = FALSE;
3091             ad = stgCallocBytes(1, stab[j].st_size, "ocGetNames_ELF(COMMON)");
3092             /*
3093             debugBelch("COMMON symbol, size %d name %s\n",
3094                             stab[j].st_size, nm);
3095             */
3096             /* Pointless to do addProddableBlock() for this area,
3097                since the linker should never poke around in it. */
3098          }
3099          else
3100          if ( ( ELF_ST_BIND(stab[j].st_info)==STB_GLOBAL
3101                 || ELF_ST_BIND(stab[j].st_info)==STB_LOCAL
3102               )
3103               /* and not an undefined symbol */
3104               && stab[j].st_shndx != SHN_UNDEF
3105               /* and not in a "special section" */
3106               && stab[j].st_shndx < SHN_LORESERVE
3107               &&
3108               /* and it's a not a section or string table or anything silly */
3109               ( ELF_ST_TYPE(stab[j].st_info)==STT_FUNC ||
3110                 ELF_ST_TYPE(stab[j].st_info)==STT_OBJECT ||
3111                 ELF_ST_TYPE(stab[j].st_info)==STT_NOTYPE
3112               )
3113             ) {
3114             /* Section 0 is the undefined section, hence > and not >=. */
3115             ASSERT(secno > 0 && secno < ehdr->e_shnum);
3116             /*
3117             if (shdr[secno].sh_type == SHT_NOBITS) {
3118                debugBelch("   BSS symbol, size %d off %d name %s\n",
3119                                stab[j].st_size, stab[j].st_value, nm);
3120             }
3121             */
3122             ad = ehdrC + shdr[ secno ].sh_offset + stab[j].st_value;
3123             if (ELF_ST_BIND(stab[j].st_info)==STB_LOCAL) {
3124                isLocal = TRUE;
3125             } else {
3126 #ifdef ELF_FUNCTION_DESC
3127                /* dlsym() and the initialisation table both give us function
3128                 * descriptors, so to be consistent we store function descriptors
3129                 * in the symbol table */
3130                if (ELF_ST_TYPE(stab[j].st_info) == STT_FUNC)
3131                    ad = (char *)allocateFunctionDesc((Elf_Addr)ad);
3132 #endif
3133                IF_DEBUG(linker,debugBelch( "addOTabName(GLOB): %10p  %s %s",
3134                                       ad, oc->fileName, nm ));
3135                isLocal = FALSE;
3136             }
3137          }
3138
3139          /* And the decision is ... */
3140
3141          if (ad != NULL) {
3142             ASSERT(nm != NULL);
3143             oc->symbols[j] = nm;
3144             /* Acquire! */
3145             if (isLocal) {
3146                /* Ignore entirely. */
3147             } else {
3148                ghciInsertStrHashTable(oc->fileName, symhash, nm, ad);
3149             }
3150          } else {
3151             /* Skip. */
3152             IF_DEBUG(linker,debugBelch( "skipping `%s'\n",
3153                                    strtab + stab[j].st_name ));
3154             /*
3155             debugBelch(
3156                     "skipping   bind = %d,  type = %d,  shndx = %d   `%s'\n",
3157                     (int)ELF_ST_BIND(stab[j].st_info),
3158                     (int)ELF_ST_TYPE(stab[j].st_info),
3159                     (int)stab[j].st_shndx,
3160                     strtab + stab[j].st_name
3161                    );
3162             */
3163             oc->symbols[j] = NULL;
3164          }
3165
3166       }
3167    }
3168
3169    return 1;
3170 }
3171
3172 /* Do ELF relocations which lack an explicit addend.  All x86-linux
3173    relocations appear to be of this form. */
3174 static int
3175 do_Elf_Rel_relocations ( ObjectCode* oc, char* ehdrC,
3176                          Elf_Shdr* shdr, int shnum,
3177                          Elf_Sym*  stab, char* strtab )
3178 {
3179    int j;
3180    char *symbol;
3181    Elf_Word* targ;
3182    Elf_Rel*  rtab = (Elf_Rel*) (ehdrC + shdr[shnum].sh_offset);
3183    int         nent = shdr[shnum].sh_size / sizeof(Elf_Rel);
3184    int target_shndx = shdr[shnum].sh_info;
3185    int symtab_shndx = shdr[shnum].sh_link;
3186
3187    stab  = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
3188    targ  = (Elf_Word*)(ehdrC + shdr[ target_shndx ].sh_offset);
3189    IF_DEBUG(linker,debugBelch( "relocations for section %d using symtab %d\n",
3190                           target_shndx, symtab_shndx ));
3191
3192    /* Skip sections that we're not interested in. */
3193    {
3194        int is_bss;
3195        SectionKind kind = getSectionKind_ELF(&shdr[target_shndx], &is_bss);
3196        if (kind == SECTIONKIND_OTHER) {
3197            IF_DEBUG(linker,debugBelch( "skipping (target section not loaded)"));
3198            return 1;
3199        }
3200    }
3201
3202    for (j = 0; j < nent; j++) {
3203       Elf_Addr offset = rtab[j].r_offset;
3204       Elf_Addr info   = rtab[j].r_info;
3205
3206       Elf_Addr  P  = ((Elf_Addr)targ) + offset;
3207       Elf_Word* pP = (Elf_Word*)P;
3208       Elf_Addr  A  = *pP;
3209       Elf_Addr  S;
3210       void*     S_tmp;
3211       Elf_Addr  value;
3212       StgStablePtr stablePtr;
3213       StgPtr stableVal;
3214
3215       IF_DEBUG(linker,debugBelch( "Rel entry %3d is raw(%6p %6p)",
3216                              j, (void*)offset, (void*)info ));
3217       if (!info) {
3218          IF_DEBUG(linker,debugBelch( " ZERO" ));
3219          S = 0;
3220       } else {
3221          Elf_Sym sym = stab[ELF_R_SYM(info)];
3222          /* First see if it is a local symbol. */
3223          if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
3224             /* Yes, so we can get the address directly from the ELF symbol
3225                table. */
3226             symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
3227             S = (Elf_Addr)
3228                 (ehdrC + shdr[ sym.st_shndx ].sh_offset
3229                        + stab[ELF_R_SYM(info)].st_value);
3230
3231          } else {
3232             symbol = strtab + sym.st_name;
3233             stablePtr = (StgStablePtr)lookupHashTable(stablehash, (StgWord)symbol);
3234             if (NULL == stablePtr) {
3235               /* No, so look up the name in our global table. */
3236               S_tmp = lookupSymbol( symbol );
3237               S = (Elf_Addr)S_tmp;
3238             } else {
3239               stableVal = deRefStablePtr( stablePtr );
3240               S_tmp = stableVal;
3241               S = (Elf_Addr)S_tmp;
3242             }
3243          }
3244          if (!S) {
3245             errorBelch("%s: unknown symbol `%s'", oc->fileName, symbol);
3246             return 0;
3247          }
3248          IF_DEBUG(linker,debugBelch( "`%s' resolves to %p\n", symbol, (void*)S ));
3249       }
3250
3251       IF_DEBUG(linker,debugBelch( "Reloc: P = %p   S = %p   A = %p\n",
3252                              (void*)P, (void*)S, (void*)A ));
3253       checkProddableBlock ( oc, pP );
3254
3255       value = S + A;
3256
3257       switch (ELF_R_TYPE(info)) {
3258 #        ifdef i386_HOST_ARCH
3259          case R_386_32:   *pP = value;     break;
3260          case R_386_PC32: *pP = value - P; break;
3261 #        endif
3262          default:
3263             errorBelch("%s: unhandled ELF relocation(Rel) type %lu\n",
3264                   oc->fileName, (lnat)ELF_R_TYPE(info));
3265             return 0;
3266       }
3267
3268    }
3269    return 1;
3270 }
3271
3272 /* Do ELF relocations for which explicit addends are supplied.
3273    sparc-solaris relocations appear to be of this form. */
3274 static int
3275 do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
3276                           Elf_Shdr* shdr, int shnum,
3277                           Elf_Sym*  stab, char* strtab )
3278 {
3279    int j;
3280    char *symbol = NULL;
3281    Elf_Addr targ;
3282    Elf_Rela* rtab = (Elf_Rela*) (ehdrC + shdr[shnum].sh_offset);
3283    int         nent = shdr[shnum].sh_size / sizeof(Elf_Rela);
3284    int target_shndx = shdr[shnum].sh_info;
3285    int symtab_shndx = shdr[shnum].sh_link;
3286
3287    stab  = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
3288    targ  = (Elf_Addr) (ehdrC + shdr[ target_shndx ].sh_offset);
3289    IF_DEBUG(linker,debugBelch( "relocations for section %d using symtab %d\n",
3290                           target_shndx, symtab_shndx ));
3291
3292    for (j = 0; j < nent; j++) {
3293 #if defined(DEBUG) || defined(sparc_HOST_ARCH) || defined(ia64_HOST_ARCH) || defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH)
3294       /* This #ifdef only serves to avoid unused-var warnings. */
3295       Elf_Addr  offset = rtab[j].r_offset;
3296       Elf_Addr  P      = targ + offset;
3297 #endif
3298       Elf_Addr  info   = rtab[j].r_info;
3299       Elf_Addr  A      = rtab[j].r_addend;
3300       Elf_Addr  S;
3301       void*     S_tmp;
3302       Elf_Addr  value;
3303 #     if defined(sparc_HOST_ARCH)
3304       Elf_Word* pP = (Elf_Word*)P;
3305       Elf_Word  w1, w2;
3306 #     elif defined(ia64_HOST_ARCH)
3307       Elf64_Xword *pP = (Elf64_Xword *)P;
3308       Elf_Addr addr;
3309 #     elif defined(powerpc_HOST_ARCH)
3310       Elf_Sword delta;
3311 #     endif
3312
3313       IF_DEBUG(linker,debugBelch( "Rel entry %3d is raw(%6p %6p %6p)   ",
3314                              j, (void*)offset, (void*)info,
3315                                 (void*)A ));
3316       if (!info) {
3317          IF_DEBUG(linker,debugBelch( " ZERO" ));
3318          S = 0;
3319       } else {
3320          Elf_Sym sym = stab[ELF_R_SYM(info)];
3321          /* First see if it is a local symbol. */
3322          if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
3323             /* Yes, so we can get the address directly from the ELF symbol
3324                table. */
3325             symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
3326             S = (Elf_Addr)
3327                 (ehdrC + shdr[ sym.st_shndx ].sh_offset
3328                        + stab[ELF_R_SYM(info)].st_value);
3329 #ifdef ELF_FUNCTION_DESC
3330             /* Make a function descriptor for this function */
3331             if (S && ELF_ST_TYPE(sym.st_info) == STT_FUNC) {
3332                S = allocateFunctionDesc(S + A);
3333                A = 0;
3334             }
3335 #endif
3336          } else {
3337             /* No, so look up the name in our global table. */
3338             symbol = strtab + sym.st_name;
3339             S_tmp = lookupSymbol( symbol );
3340             S = (Elf_Addr)S_tmp;
3341
3342 #ifdef ELF_FUNCTION_DESC
3343             /* If a function, already a function descriptor - we would
3344                have to copy it to add an offset. */
3345             if (S && (ELF_ST_TYPE(sym.st_info) == STT_FUNC) && (A != 0))
3346                errorBelch("%s: function %s with addend %p", oc->fileName, symbol, (void *)A);
3347 #endif
3348          }
3349          if (!S) {
3350            errorBelch("%s: unknown symbol `%s'", oc->fileName, symbol);
3351            return 0;
3352          }
3353          IF_DEBUG(linker,debugBelch( "`%s' resolves to %p", symbol, (void*)S ));
3354       }
3355
3356       IF_DEBUG(linker,debugBelch("Reloc: P = %p   S = %p   A = %p\n",
3357                                         (void*)P, (void*)S, (void*)A ));
3358       /* checkProddableBlock ( oc, (void*)P ); */
3359
3360       value = S + A;
3361
3362       switch (ELF_R_TYPE(info)) {
3363 #        if defined(sparc_HOST_ARCH)
3364          case R_SPARC_WDISP30:
3365             w1 = *pP & 0xC0000000;
3366             w2 = (Elf_Word)((value - P) >> 2);
3367             ASSERT((w2 & 0xC0000000) == 0);
3368             w1 |= w2;
3369             *pP = w1;
3370             break;
3371          case R_SPARC_HI22:
3372             w1 = *pP & 0xFFC00000;
3373             w2 = (Elf_Word)(value >> 10);
3374             ASSERT((w2 & 0xFFC00000) == 0);
3375             w1 |= w2;
3376             *pP = w1;
3377             break;
3378          case R_SPARC_LO10:
3379             w1 = *pP & ~0x3FF;
3380             w2 = (Elf_Word)(value & 0x3FF);
3381             ASSERT((w2 & ~0x3FF) == 0);
3382             w1 |= w2;
3383             *pP = w1;
3384             break;
3385          /* According to the Sun documentation:
3386             R_SPARC_UA32
3387             This relocation type resembles R_SPARC_32, except it refers to an
3388             unaligned word. That is, the word to be relocated must be treated
3389             as four separate bytes with arbitrary alignment, not as a word
3390             aligned according to the architecture requirements.
3391
3392             (JRS: which means that freeloading on the R_SPARC_32 case
3393             is probably wrong, but hey ...)
3394          */
3395          case R_SPARC_UA32:
3396          case R_SPARC_32:
3397             w2 = (Elf_Word)value;
3398             *pP = w2;
3399             break;
3400 #        elif defined(ia64_HOST_ARCH)
3401          case R_IA64_DIR64LSB:
3402          case R_IA64_FPTR64LSB:
3403             *pP = value;
3404             break;
3405          case R_IA64_PCREL64LSB:
3406             *pP = value - P;
3407             break;
3408          case R_IA64_SEGREL64LSB:
3409             addr = findElfSegment(ehdrC, value);
3410             *pP = value - addr;
3411             break;
3412          case R_IA64_GPREL22:
3413             ia64_reloc_gprel22(P, value);
3414             break;
3415          case R_IA64_LTOFF22:
3416          case R_IA64_LTOFF22X:
3417          case R_IA64_LTOFF_FPTR22:
3418             addr = allocateGOTEntry(value);
3419             ia64_reloc_gprel22(P, addr);
3420             break;
3421          case R_IA64_PCREL21B:
3422             ia64_reloc_pcrel21(P, S, oc);
3423             break;
3424          case R_IA64_LDXMOV:
3425             /* This goes with R_IA64_LTOFF22X and points to the load to
3426              * convert into a move.  We don't implement relaxation. */
3427             break;
3428 #        elif defined(powerpc_HOST_ARCH)
3429          case R_PPC_ADDR16_LO:
3430             *(Elf32_Half*) P = value;
3431             break;
3432
3433          case R_PPC_ADDR16_HI:
3434             *(Elf32_Half*) P = value >> 16;
3435             break;
3436  
3437          case R_PPC_ADDR16_HA:
3438             *(Elf32_Half*) P = (value + 0x8000) >> 16;
3439             break;
3440
3441          case R_PPC_ADDR32:
3442             *(Elf32_Word *) P = value;
3443             break;
3444
3445          case R_PPC_REL32:
3446             *(Elf32_Word *) P = value - P;
3447             break;
3448
3449          case R_PPC_REL24:
3450             delta = value - P;
3451
3452             if( delta << 6 >> 6 != delta )
3453             {
3454                value = (Elf_Addr) (&makeSymbolExtra( oc, ELF_R_SYM(info), value )
3455                                         ->jumpIsland);
3456                delta = value - P;
3457
3458                if( value == 0 || delta << 6 >> 6 != delta )
3459                {
3460                   barf( "Unable to make SymbolExtra for #%d",
3461                         ELF_R_SYM(info) );
3462                   return 0;
3463                }
3464             }
3465
3466             *(Elf_Word *) P = (*(Elf_Word *) P & 0xfc000003)
3467                                           | (delta & 0x3fffffc);
3468             break;
3469 #        endif
3470
3471 #if x86_64_HOST_ARCH
3472       case R_X86_64_64:
3473           *(Elf64_Xword *)P = value;
3474           break;
3475
3476       case R_X86_64_PC32:
3477       {
3478           StgInt64 off = value - P;
3479           if (off >= 0x7fffffffL || off < -0x80000000L) {
3480               barf("R_X86_64_PC32 relocation out of range: %s = %p",
3481                    symbol, off);
3482           }
3483           *(Elf64_Word *)P = (Elf64_Word)off;
3484           break;
3485       }
3486
3487       case R_X86_64_32:
3488           if (value >= 0x7fffffffL) {
3489               barf("R_X86_64_32 relocation out of range: %s = %p\n",
3490                    symbol, value);
3491           }
3492           *(Elf64_Word *)P = (Elf64_Word)value;
3493           break;
3494
3495       case R_X86_64_32S:
3496           if ((StgInt64)value > 0x7fffffffL || (StgInt64)value < -0x80000000L) {
3497               barf("R_X86_64_32S relocation out of range: %s = %p\n",
3498                    symbol, value);
3499           }
3500           *(Elf64_Sword *)P = (Elf64_Sword)value;
3501           break;
3502 #endif
3503
3504          default:
3505             errorBelch("%s: unhandled ELF relocation(RelA) type %lu\n",
3506                   oc->fileName, (lnat)ELF_R_TYPE(info));
3507             return 0;
3508       }
3509
3510    }
3511    return 1;
3512 }
3513
3514 static int
3515 ocResolve_ELF ( ObjectCode* oc )
3516 {
3517    char *strtab;
3518    int   shnum, ok;
3519    Elf_Sym*  stab  = NULL;
3520    char*     ehdrC = (char*)(oc->image);
3521    Elf_Ehdr* ehdr  = (Elf_Ehdr*) ehdrC;
3522    Elf_Shdr* shdr  = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
3523
3524    /* first find "the" symbol table */
3525    stab = (Elf_Sym*) findElfSection ( ehdrC, SHT_SYMTAB );
3526
3527    /* also go find the string table */
3528    strtab = findElfSection ( ehdrC, SHT_STRTAB );
3529
3530    if (stab == NULL || strtab == NULL) {
3531       errorBelch("%s: can't find string or symbol table", oc->fileName);
3532       return 0;
3533    }
3534
3535    /* Process the relocation sections. */
3536    for (shnum = 0; shnum < ehdr->e_shnum; shnum++) {
3537       if (shdr[shnum].sh_type == SHT_REL) {
3538          ok = do_Elf_Rel_relocations ( oc, ehdrC, shdr,
3539                                        shnum, stab, strtab );
3540          if (!ok) return ok;
3541       }
3542       else
3543       if (shdr[shnum].sh_type == SHT_RELA) {
3544          ok = do_Elf_Rela_relocations ( oc, ehdrC, shdr,
3545                                         shnum, stab, strtab );
3546          if (!ok) return ok;
3547       }
3548    }
3549
3550    /* Free the local symbol table; we won't need it again. */
3551    freeHashTable(oc->lochash, NULL);
3552    oc->lochash = NULL;
3553
3554 #if defined(powerpc_HOST_ARCH)
3555    ocFlushInstructionCache( oc );
3556 #endif
3557
3558    return 1;
3559 }
3560
3561 /*
3562  * IA64 specifics
3563  * Instructions are 41 bits long, packed into 128 bit bundles with a 5-bit template
3564  * at the front.  The following utility functions pack and unpack instructions, and
3565  * take care of the most common relocations.
3566  */
3567
3568 #ifdef ia64_HOST_ARCH
3569
3570 static Elf64_Xword
3571 ia64_extract_instruction(Elf64_Xword *target)
3572 {
3573    Elf64_Xword w1, w2;
3574    int slot = (Elf_Addr)target & 3;
3575    target = (Elf_Addr)target & ~3;
3576
3577    w1 = *target;
3578    w2 = *(target+1);
3579
3580    switch (slot)
3581    {
3582       case 0:
3583          return ((w1 >> 5) & 0x1ffffffffff);
3584       case 1:
3585          return (w1 >> 46) | ((w2 & 0x7fffff) << 18);
3586       case 2:
3587          return (w2 >> 23);
3588       default:
3589          barf("ia64_extract_instruction: invalid slot %p", target);
3590    }
3591 }
3592
3593 static void
3594 ia64_deposit_instruction(Elf64_Xword *target, Elf64_Xword value)
3595 {
3596    int slot = (Elf_Addr)target & 3;
3597    target = (Elf_Addr)target & ~3;
3598
3599    switch (slot)
3600    {
3601       case 0:
3602          *target |= value << 5;
3603          break;
3604       case 1:
3605          *target |= value << 46;
3606          *(target+1) |= value >> 18;
3607          break;
3608       case 2:
3609          *(target+1) |= value << 23;
3610          break;
3611    }
3612 }
3613
3614 static void
3615 ia64_reloc_gprel22(Elf_Addr target, Elf_Addr value)
3616 {
3617    Elf64_Xword instruction;
3618    Elf64_Sxword rel_value;
3619
3620    rel_value = value - gp_val;
3621    if ((rel_value > 0x1fffff) || (rel_value < -0x1fffff))
3622       barf("GP-relative data out of range (address = 0x%lx, gp = 0x%lx)", value, gp_val);
3623
3624    instruction = ia64_extract_instruction((Elf64_Xword *)target);
3625    instruction |= (((rel_value >> 0) & 0x07f) << 13)            /* imm7b */
3626                     | (((rel_value >> 7) & 0x1ff) << 27)        /* imm9d */
3627                     | (((rel_value >> 16) & 0x01f) << 22)       /* imm5c */
3628                     | ((Elf64_Xword)(rel_value < 0) << 36);     /* s */
3629    ia64_deposit_instruction((Elf64_Xword *)target, instruction);
3630 }
3631
3632 static void
3633 ia64_reloc_pcrel21(Elf_Addr target, Elf_Addr value, ObjectCode *oc)
3634 {
3635    Elf64_Xword instruction;
3636    Elf64_Sxword rel_value;
3637    Elf_Addr entry;
3638
3639    entry = allocatePLTEntry(value, oc);
3640
3641    rel_value = (entry >> 4) - (target >> 4);
3642    if ((rel_value > 0xfffff) || (rel_value < -0xfffff))
3643       barf("PLT entry too far away (entry = 0x%lx, target = 0x%lx)", entry, target);
3644
3645    instruction = ia64_extract_instruction((Elf64_Xword *)target);
3646    instruction |= ((rel_value & 0xfffff) << 13)                 /* imm20b */
3647                     | ((Elf64_Xword)(rel_value < 0) << 36);     /* s */
3648    ia64_deposit_instruction((Elf64_Xword *)target, instruction);
3649 }
3650
3651 #endif /* ia64 */
3652
3653 /*
3654  * PowerPC ELF specifics
3655  */
3656
3657 #ifdef powerpc_HOST_ARCH
3658
3659 static int ocAllocateSymbolExtras_ELF( ObjectCode *oc )
3660 {
3661   Elf_Ehdr *ehdr;
3662   Elf_Shdr* shdr;
3663   int i;
3664
3665   ehdr = (Elf_Ehdr *) oc->image;
3666   shdr = (Elf_Shdr *) ( ((char *)oc->image) + ehdr->e_shoff );
3667
3668   for( i = 0; i < ehdr->e_shnum; i++ )
3669     if( shdr[i].sh_type == SHT_SYMTAB )
3670       break;
3671
3672   if( i == ehdr->e_shnum )
3673   {
3674     errorBelch( "This ELF file contains no symtab" );
3675     return 0;
3676   }
3677
3678   if( shdr[i].sh_entsize != sizeof( Elf_Sym ) )
3679   {
3680     errorBelch( "The entry size (%d) of the symtab isn't %d\n",
3681       shdr[i].sh_entsize, sizeof( Elf_Sym ) );
3682     
3683     return 0;
3684   }
3685
3686   return ocAllocateSymbolExtras( oc, shdr[i].sh_size / sizeof( Elf_Sym ), 0 );
3687 }
3688
3689 #endif /* powerpc */
3690
3691 #endif /* ELF */
3692
3693 /* --------------------------------------------------------------------------
3694  * Mach-O specifics
3695  * ------------------------------------------------------------------------*/
3696
3697 #if defined(OBJFORMAT_MACHO)
3698
3699 /*
3700   Support for MachO linking on Darwin/MacOS X
3701   by Wolfgang Thaller (wolfgang.thaller@gmx.net)
3702
3703   I hereby formally apologize for the hackish nature of this code.
3704   Things that need to be done:
3705   *) implement ocVerifyImage_MachO
3706   *) add still more sanity checks.
3707 */
3708
3709 #if x86_64_HOST_ARCH || powerpc64_HOST_ARCH
3710 #define mach_header mach_header_64
3711 #define segment_command segment_command_64
3712 #define section section_64
3713 #define nlist nlist_64
3714 #endif
3715
3716 #ifdef powerpc_HOST_ARCH
3717 static int ocAllocateSymbolExtras_MachO(ObjectCode* oc)
3718 {
3719     struct mach_header *header = (struct mach_header *) oc->image;
3720     struct load_command *lc = (struct load_command *) (header + 1);
3721     unsigned i;
3722
3723     for( i = 0; i < header->ncmds; i++ )
3724     {   
3725         if( lc->cmd == LC_SYMTAB )
3726         {
3727                 // Find out the first and last undefined external
3728                 // symbol, so we don't have to allocate too many
3729                 // jump islands.
3730             struct symtab_command *symLC = (struct symtab_command *) lc;
3731             unsigned min = symLC->nsyms, max = 0;
3732             struct nlist *nlist =
3733                 symLC ? (struct nlist*) ((char*) oc->image + symLC->symoff)
3734                       : NULL;
3735             for(i=0;i<symLC->nsyms;i++)
3736             {
3737                 if(nlist[i].n_type & N_STAB)
3738                     ;
3739                 else if(nlist[i].n_type & N_EXT)
3740                 {
3741                     if((nlist[i].n_type & N_TYPE) == N_UNDF
3742                         && (nlist[i].n_value == 0))
3743                     {
3744                         if(i < min)
3745                             min = i;
3746                         if(i > max)
3747                             max = i;
3748                     }
3749                 }
3750             }
3751             if(max >= min)
3752                 return ocAllocateSymbolExtras(oc, max - min + 1, min);
3753
3754             break;
3755         }
3756         
3757         lc = (struct load_command *) ( ((char *)lc) + lc->cmdsize );
3758     }
3759     return ocAllocateSymbolExtras(oc,0,0);
3760 }
3761 #endif
3762 #ifdef x86_64_HOST_ARCH
3763 static int ocAllocateSymbolExtras_MachO(ObjectCode* oc)
3764 {
3765     struct mach_header *header = (struct mach_header *) oc->image;
3766     struct load_command *lc = (struct load_command *) (header + 1);
3767     unsigned i;
3768
3769     for( i = 0; i < header->ncmds; i++ )
3770     {   
3771         if( lc->cmd == LC_SYMTAB )
3772         {
3773                 // Just allocate one entry for every symbol
3774             struct symtab_command *symLC = (struct symtab_command *) lc;
3775             
3776             return ocAllocateSymbolExtras(oc, symLC->nsyms, 0);
3777         }
3778         
3779         lc = (struct load_command *) ( ((char *)lc) + lc->cmdsize );
3780     }
3781     return ocAllocateSymbolExtras(oc,0,0);
3782 }
3783 #endif
3784
3785 static int ocVerifyImage_MachO(ObjectCode* oc)
3786 {
3787     char *image = (char*) oc->image;
3788     struct mach_header *header = (struct mach_header*) image;
3789
3790 #if x86_64_TARGET_ARCH || powerpc64_TARGET_ARCH
3791     if(header->magic != MH_MAGIC_64)
3792         return 0;
3793 #else
3794     if(header->magic != MH_MAGIC)
3795         return 0;
3796 #endif
3797     // FIXME: do some more verifying here
3798     return 1;
3799 }
3800
3801 static int resolveImports(
3802     ObjectCode* oc,
3803     char *image,
3804     struct symtab_command *symLC,
3805     struct section *sect,    // ptr to lazy or non-lazy symbol pointer section
3806     unsigned long *indirectSyms,
3807     struct nlist *nlist)
3808 {
3809     unsigned i;
3810     size_t itemSize = 4;
3811
3812 #if i386_HOST_ARCH
3813     int isJumpTable = 0;
3814     if(!strcmp(sect->sectname,"__jump_table"))
3815     {
3816         isJumpTable = 1;
3817         itemSize = 5;
3818         ASSERT(sect->reserved2 == itemSize);
3819     }
3820 #endif
3821
3822     for(i=0; i*itemSize < sect->size;i++)
3823     {
3824         // according to otool, reserved1 contains the first index into the indirect symbol table
3825         struct nlist *symbol = &nlist[indirectSyms[sect->reserved1+i]];
3826         char *nm = image + symLC->stroff + symbol->n_un.n_strx;
3827         void *addr = NULL;
3828
3829         if((symbol->n_type & N_TYPE) == N_UNDF
3830             && (symbol->n_type & N_EXT) && (symbol->n_value != 0))
3831             addr = (void*) (symbol->n_value);
3832         else if((addr = lookupLocalSymbol(oc,nm)) != NULL)
3833             ;
3834         else
3835             addr = lookupSymbol(nm);
3836         if(!addr)
3837         {
3838             errorBelch("\n%s: unknown symbol `%s'", oc->fileName, nm);
3839             return 0;
3840         }
3841         ASSERT(addr);
3842
3843 #if i386_HOST_ARCH
3844         if(isJumpTable)
3845         {
3846             checkProddableBlock(oc,image + sect->offset + i*itemSize);
3847             *(image + sect->offset + i*itemSize) = 0xe9; // jmp
3848             *(unsigned*)(image + sect->offset + i*itemSize + 1)
3849                 = (char*)addr - (image + sect->offset + i*itemSize + 5);
3850         }
3851         else
3852 #endif
3853         {
3854             checkProddableBlock(oc,((void**)(image + sect->offset)) + i);
3855             ((void**)(image + sect->offset))[i] = addr;
3856         }
3857     }
3858
3859     return 1;
3860 }
3861
3862 static unsigned long relocateAddress(
3863     ObjectCode* oc,
3864     int nSections,
3865     struct section* sections,
3866     unsigned long address)
3867 {
3868     int i;
3869     for(i = 0; i < nSections; i++)
3870     {
3871         if(sections[i].addr <= address
3872             && address < sections[i].addr + sections[i].size)
3873         {
3874             return (unsigned long)oc->image
3875                     + sections[i].offset + address - sections[i].addr;
3876         }
3877     }
3878     barf("Invalid Mach-O file:"
3879          "Address out of bounds while relocating object file");
3880     return 0;
3881 }
3882
3883 static int relocateSection(
3884     ObjectCode* oc,
3885     char *image,
3886     struct symtab_command *symLC, struct nlist *nlist,
3887     int nSections, struct section* sections, struct section *sect)
3888 {
3889     struct relocation_info *relocs;
3890     int i,n;
3891
3892     if(!strcmp(sect->sectname,"__la_symbol_ptr"))
3893         return 1;
3894     else if(!strcmp(sect->sectname,"__nl_symbol_ptr"))
3895         return 1;
3896     else if(!strcmp(sect->sectname,"__la_sym_ptr2"))
3897         return 1;
3898     else if(!strcmp(sect->sectname,"__la_sym_ptr3"))
3899         return 1;
3900
3901     n = sect->nreloc;
3902     relocs = (struct relocation_info*) (image + sect->reloff);
3903
3904     for(i=0;i<n;i++)
3905     {
3906 #ifdef x86_64_HOST_ARCH
3907         struct relocation_info *reloc = &relocs[i];
3908         
3909         char    *thingPtr = image + sect->offset + reloc->r_address;
3910         uint64_t thing;
3911         uint64_t value;
3912         uint64_t baseValue;
3913         int type = reloc->r_type;
3914         
3915         checkProddableBlock(oc,thingPtr);
3916         switch(reloc->r_length)
3917         {
3918             case 0:
3919                 thing = *(uint8_t*)thingPtr;
3920                 baseValue = (uint64_t)thingPtr + 1;
3921                 break;
3922             case 1:
3923                 thing = *(uint16_t*)thingPtr;
3924                 baseValue = (uint64_t)thingPtr + 2;
3925                 break;
3926             case 2:
3927                 thing = *(uint32_t*)thingPtr;
3928                 baseValue = (uint64_t)thingPtr + 4;
3929                 break;
3930             case 3:
3931                 thing = *(uint64_t*)thingPtr;
3932                 baseValue = (uint64_t)thingPtr + 8;
3933                 break;
3934             default:
3935                 barf("Unknown size.");
3936         }
3937         
3938         if(type == X86_64_RELOC_GOT
3939            || type == X86_64_RELOC_GOT_LOAD)
3940         {
3941             ASSERT(reloc->r_extern);
3942             value = (uint64_t) &makeSymbolExtra(oc, reloc->r_symbolnum, value)->addr;
3943             
3944             type = X86_64_RELOC_SIGNED;
3945         }
3946         else if(reloc->r_extern)
3947         {
3948             struct nlist *symbol = &nlist[reloc->r_symbolnum];
3949             char *nm = image + symLC->stroff + symbol->n_un.n_strx;
3950             if(symbol->n_value == 0)
3951                 value = (uint64_t) lookupSymbol(nm);
3952             else
3953                 value = relocateAddress(oc, nSections, sections,
3954                                         symbol->n_value);
3955         }
3956         else
3957         {
3958             value = sections[reloc->r_symbolnum-1].offset
3959                   - sections[reloc->r_symbolnum-1].addr
3960                   + (uint64_t) image;
3961         }
3962         
3963         if(type == X86_64_RELOC_BRANCH)
3964         {
3965             if((int32_t)(value - baseValue) != (int64_t)(value - baseValue))
3966             {
3967                 ASSERT(reloc->r_extern);
3968                 value = (uint64_t) &makeSymbolExtra(oc, reloc->r_symbolnum, value)
3969                                         -> jumpIsland;
3970             }
3971             ASSERT((int32_t)(value - baseValue) == (int64_t)(value - baseValue));
3972             type = X86_64_RELOC_SIGNED;
3973         }
3974         
3975         switch(type)
3976         {
3977             case X86_64_RELOC_UNSIGNED:
3978                 ASSERT(!reloc->r_pcrel);
3979                 thing += value;
3980                 break;
3981             case X86_64_RELOC_SIGNED:
3982                 ASSERT(reloc->r_pcrel);
3983                 thing += value - baseValue;
3984                 break;
3985             case X86_64_RELOC_SUBTRACTOR:
3986                 ASSERT(!reloc->r_pcrel);
3987                 thing -= value;
3988                 break;
3989             default:
3990                 barf("unkown relocation");
3991         }
3992                 
3993         switch(reloc->r_length)
3994         {
3995             case 0:
3996                 *(uint8_t*)thingPtr = thing;
3997                 break;
3998             case 1:
3999                 *(uint16_t*)thingPtr = thing;
4000                 break;
4001             case 2:
4002                 *(uint32_t*)thingPtr = thing;
4003                 break;
4004             case 3:
4005                 *(uint64_t*)thingPtr = thing;
4006                 break;
4007         }
4008 #else
4009         if(relocs[i].r_address & R_SCATTERED)
4010         {
4011             struct scattered_relocation_info *scat =
4012                 (struct scattered_relocation_info*) &relocs[i];
4013
4014             if(!scat->r_pcrel)
4015             {
4016                 if(scat->r_length == 2)
4017                 {
4018                     unsigned long word = 0;
4019                     unsigned long* wordPtr = (unsigned long*) (image + sect->offset + scat->r_address);
4020                     checkProddableBlock(oc,wordPtr);
4021
4022                     // Note on relocation types:
4023                     // i386 uses the GENERIC_RELOC_* types,
4024                     // while ppc uses special PPC_RELOC_* types.
4025                     // *_RELOC_VANILLA and *_RELOC_PAIR have the same value
4026                     // in both cases, all others are different.
4027                     // Therefore, we use GENERIC_RELOC_VANILLA
4028                     // and GENERIC_RELOC_PAIR instead of the PPC variants,
4029                     // and use #ifdefs for the other types.
4030                     
4031                     // Step 1: Figure out what the relocated value should be
4032                     if(scat->r_type == GENERIC_RELOC_VANILLA)
4033                     {
4034                         word = *wordPtr + (unsigned long) relocateAddress(
4035                                                                 oc,
4036                                                                 nSections,
4037                                                                 sections,
4038                                                                 scat->r_value)
4039                                         - scat->r_value;
4040                     }
4041 #ifdef powerpc_HOST_ARCH
4042                     else if(scat->r_type == PPC_RELOC_SECTDIFF
4043                         || scat->r_type == PPC_RELOC_LO16_SECTDIFF
4044                         || scat->r_type == PPC_RELOC_HI16_SECTDIFF
4045                         || scat->r_type == PPC_RELOC_HA16_SECTDIFF)
4046 #else
4047                     else if(scat->r_type == GENERIC_RELOC_SECTDIFF)
4048 #endif
4049                     {
4050                         struct scattered_relocation_info *pair =
4051                                 (struct scattered_relocation_info*) &relocs[i+1];
4052
4053                         if(!pair->r_scattered || pair->r_type != GENERIC_RELOC_PAIR)
4054                             barf("Invalid Mach-O file: "
4055                                  "RELOC_*_SECTDIFF not followed by RELOC_PAIR");
4056
4057                         word = (unsigned long)
4058                                (relocateAddress(oc, nSections, sections, scat->r_value)
4059                               - relocateAddress(oc, nSections, sections, pair->r_value));
4060                         i++;
4061                     }
4062 #ifdef powerpc_HOST_ARCH
4063                     else if(scat->r_type == PPC_RELOC_HI16
4064                          || scat->r_type == PPC_RELOC_LO16
4065                          || scat->r_type == PPC_RELOC_HA16
4066                          || scat->r_type == PPC_RELOC_LO14)
4067                     {   // these are generated by label+offset things
4068                         struct relocation_info *pair = &relocs[i+1];
4069                         if((pair->r_address & R_SCATTERED) || pair->r_type != PPC_RELOC_PAIR)
4070                             barf("Invalid Mach-O file: "
4071                                  "PPC_RELOC_* not followed by PPC_RELOC_PAIR");
4072                         
4073                         if(scat->r_type == PPC_RELOC_LO16)
4074                         {
4075                             word = ((unsigned short*) wordPtr)[1];
4076                             word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF) << 16;
4077                         }
4078                         else if(scat->r_type == PPC_RELOC_LO14)
4079                         {
4080                             barf("Unsupported Relocation: PPC_RELOC_LO14");
4081                             word = ((unsigned short*) wordPtr)[1] & 0xFFFC;
4082                             word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF) << 16;
4083                         }
4084                         else if(scat->r_type == PPC_RELOC_HI16)
4085                         {
4086                             word = ((unsigned short*) wordPtr)[1] << 16;
4087                             word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF);
4088                         }
4089                         else if(scat->r_type == PPC_RELOC_HA16)
4090                         {
4091                             word = ((unsigned short*) wordPtr)[1] << 16;
4092                             word += ((short)relocs[i+1].r_address & (short)0xFFFF);
4093                         }
4094                        
4095                         
4096                         word += (unsigned long) relocateAddress(oc, nSections, sections, scat->r_value)
4097                                                 - scat->r_value;
4098                         
4099                         i++;
4100                     }
4101  #endif
4102                     else
4103                         continue;  // ignore the others
4104
4105 #ifdef powerpc_HOST_ARCH
4106                     if(scat->r_type == GENERIC_RELOC_VANILLA
4107                         || scat->r_type == PPC_RELOC_SECTDIFF)
4108 #else
4109                     if(scat->r_type == GENERIC_RELOC_VANILLA
4110                         || scat->r_type == GENERIC_RELOC_SECTDIFF)
4111 #endif
4112                     {
4113                         *wordPtr = word;
4114                     }
4115 #ifdef powerpc_HOST_ARCH
4116                     else if(scat->r_type == PPC_RELOC_LO16_SECTDIFF || scat->r_type == PPC_RELOC_LO16)
4117                     {
4118                         ((unsigned short*) wordPtr)[1] = word & 0xFFFF;
4119                     }
4120                     else if(scat->r_type == PPC_RELOC_HI16_SECTDIFF || scat->r_type == PPC_RELOC_HI16)
4121                     {
4122                         ((unsigned short*) wordPtr)[1] = (word >> 16) & 0xFFFF;
4123                     }
4124                     else if(scat->r_type == PPC_RELOC_HA16_SECTDIFF || scat->r_type == PPC_RELOC_HA16)
4125                     {
4126                         ((unsigned short*) wordPtr)[1] = ((word >> 16) & 0xFFFF)
4127                             + ((word & (1<<15)) ? 1 : 0);
4128                     }
4129 #endif
4130                 }
4131             }
4132
4133             continue; // FIXME: I hope it's OK to ignore all the others.
4134         }
4135         else
4136         {
4137             struct relocation_info *reloc = &relocs[i];
4138             if(reloc->r_pcrel && !reloc->r_extern)
4139                 continue;
4140
4141             if(reloc->r_length == 2)
4142             {
4143                 unsigned long word = 0;
4144 #ifdef powerpc_HOST_ARCH
4145                 unsigned long jumpIsland = 0;
4146                 long offsetToJumpIsland = 0xBADBAD42; // initialise to bad value
4147                                                       // to avoid warning and to catch
4148                                                       // bugs.
4149 #endif
4150
4151                 unsigned long* wordPtr = (unsigned long*) (image + sect->offset + reloc->r_address);
4152                 checkProddableBlock(oc,wordPtr);
4153
4154                 if(reloc->r_type == GENERIC_RELOC_VANILLA)
4155                 {
4156                     word = *wordPtr;
4157                 }
4158 #ifdef powerpc_HOST_ARCH
4159                 else if(reloc->r_type == PPC_RELOC_LO16)
4160                 {
4161                     word = ((unsigned short*) wordPtr)[1];
4162                     word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF) << 16;
4163                 }
4164                 else if(reloc->r_type == PPC_RELOC_HI16)
4165                 {
4166                     word = ((unsigned short*) wordPtr)[1] << 16;
4167                     word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF);
4168                 }
4169                 else if(reloc->r_type == PPC_RELOC_HA16)
4170                 {
4171                     word = ((unsigned short*) wordPtr)[1] << 16;
4172                     word += ((short)relocs[i+1].r_address & (short)0xFFFF);
4173                 }
4174                 else if(reloc->r_type == PPC_RELOC_BR24)
4175                 {
4176                     word = *wordPtr;
4177                     word = (word & 0x03FFFFFC) | ((word & 0x02000000) ? 0xFC000000 : 0);
4178                 }
4179 #endif
4180
4181                 if(!reloc->r_extern)
4182                 {
4183                     long delta =
4184                         sections[reloc->r_symbolnum-1].offset
4185                         - sections[reloc->r_symbolnum-1].addr
4186                         + ((long) image);
4187
4188                     word += delta;
4189                 }
4190                 else
4191                 {
4192                     struct nlist *symbol = &nlist[reloc->r_symbolnum];
4193                     char *nm = image + symLC->stroff + symbol->n_un.n_strx;
4194                     void *symbolAddress = lookupSymbol(nm);
4195                     if(!symbolAddress)
4196                     {
4197                         errorBelch("\nunknown symbol `%s'", nm);
4198                         return 0;
4199                     }
4200
4201                     if(reloc->r_pcrel)
4202                     {  
4203 #ifdef powerpc_HOST_ARCH
4204                             // In the .o file, this should be a relative jump to NULL
4205                             // and we'll change it to a relative jump to the symbol
4206                         ASSERT(-word == reloc->r_address);
4207                         jumpIsland = (unsigned long)
4208                                         &makeSymbolExtra(oc,
4209                                                          reloc->r_symbolnum,
4210                                                          (unsigned long) symbolAddress)
4211                                          -> jumpIsland;
4212                         if(jumpIsland != 0)
4213                         {
4214                             offsetToJumpIsland = word + jumpIsland
4215                                 - (((long)image) + sect->offset - sect->addr);
4216                         }
4217 #endif
4218                         word += (unsigned long) symbolAddress
4219                                 - (((long)image) + sect->offset - sect->addr);
4220                     }
4221                     else
4222                     {
4223                         word += (unsigned long) symbolAddress;
4224                     }
4225                 }
4226
4227                 if(reloc->r_type == GENERIC_RELOC_VANILLA)
4228                 {
4229                     *wordPtr = word;
4230                     continue;
4231                 }
4232 #ifdef powerpc_HOST_ARCH
4233                 else if(reloc->r_type == PPC_RELOC_LO16)
4234                 {
4235                     ((unsigned short*) wordPtr)[1] = word & 0xFFFF;
4236                     i++; continue;
4237                 }
4238                 else if(reloc->r_type == PPC_RELOC_HI16)
4239                 {
4240                     ((unsigned short*) wordPtr)[1] = (word >> 16) & 0xFFFF;
4241                     i++; continue;
4242                 }
4243                 else if(reloc->r_type == PPC_RELOC_HA16)
4244                 {
4245                     ((unsigned short*) wordPtr)[1] = ((word >> 16) & 0xFFFF)
4246                         + ((word & (1<<15)) ? 1 : 0);
4247                     i++; continue;
4248                 }
4249                 else if(reloc->r_type == PPC_RELOC_BR24)
4250                 {
4251                     if((long)word > (long)0x01FFFFFF || (long)word < (long)0xFFE00000)
4252                     {
4253                         // The branch offset is too large.
4254                         // Therefore, we try to use a jump island.
4255                         if(jumpIsland == 0)
4256                         {
4257                             barf("unconditional relative branch out of range: "
4258                                  "no jump island available");
4259                         }
4260                         
4261                         word = offsetToJumpIsland;
4262                         if((long)word > (long)0x01FFFFFF || (long)word < (long)0xFFE00000)
4263                             barf("unconditional relative branch out of range: "
4264                                  "jump island out of range");
4265                     }
4266                     *wordPtr = (*wordPtr & 0xFC000003) | (word & 0x03FFFFFC);
4267                     continue;
4268                 }
4269 #endif
4270             }
4271             barf("\nunknown relocation %d",reloc->r_type);
4272             return 0;
4273         }
4274 #endif
4275     }
4276     return 1;
4277 }
4278
4279 static int ocGetNames_MachO(ObjectCode* oc)
4280 {
4281     char *image = (char*) oc->image;
4282     struct mach_header *header = (struct mach_header*) image;
4283     struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
4284     unsigned i,curSymbol = 0;
4285     struct segment_command *segLC = NULL;
4286     struct section *sections;
4287     struct symtab_command *symLC = NULL;
4288     struct nlist *nlist;
4289     unsigned long commonSize = 0;
4290     char    *commonStorage = NULL;
4291     unsigned long commonCounter;
4292
4293     for(i=0;i<header->ncmds;i++)
4294     {
4295         if(lc->cmd == LC_SEGMENT || lc->cmd == LC_SEGMENT_64)
4296             segLC = (struct segment_command*) lc;
4297         else if(lc->cmd == LC_SYMTAB)
4298             symLC = (struct symtab_command*) lc;
4299         lc = (struct load_command *) ( ((char*)lc) + lc->cmdsize );
4300     }
4301
4302     sections = (struct section*) (segLC+1);
4303     nlist = symLC ? (struct nlist*) (image + symLC->symoff)
4304                   : NULL;
4305     
4306     if(!segLC)
4307         barf("ocGetNames_MachO: no segment load command");
4308
4309     for(i=0;i<segLC->nsects;i++)
4310     {
4311         if(sections[i].size == 0)
4312             continue;
4313
4314         if((sections[i].flags & SECTION_TYPE) == S_ZEROFILL)
4315         {
4316             char * zeroFillArea = stgCallocBytes(1,sections[i].size,
4317                                       "ocGetNames_MachO(common symbols)");
4318             sections[i].offset = zeroFillArea - image;
4319         }
4320
4321         if(!strcmp(sections[i].sectname,"__text"))
4322             addSection(oc, SECTIONKIND_CODE_OR_RODATA,
4323                 (void*) (image + sections[i].offset),
4324                 (void*) (image + sections[i].offset + sections[i].size));
4325         else if(!strcmp(sections[i].sectname,"__const"))
4326             addSection(oc, SECTIONKIND_RWDATA,
4327                 (void*) (image + sections[i].offset),
4328                 (void*) (image + sections[i].offset + sections[i].size));
4329         else if(!strcmp(sections[i].sectname,"__data"))
4330             addSection(oc, SECTIONKIND_RWDATA,
4331                 (void*) (image + sections[i].offset),
4332                 (void*) (image + sections[i].offset + sections[i].size));
4333         else if(!strcmp(sections[i].sectname,"__bss")
4334                 || !strcmp(sections[i].sectname,"__common"))
4335             addSection(oc, SECTIONKIND_RWDATA,
4336                 (void*) (image + sections[i].offset),
4337                 (void*) (image + sections[i].offset + sections[i].size));
4338
4339         addProddableBlock(oc, (void*) (image + sections[i].offset),
4340                                         sections[i].size);
4341     }
4342
4343         // count external symbols defined here
4344     oc->n_symbols = 0;
4345     if(symLC)
4346     {
4347         for(i=0;i<symLC->nsyms;i++)
4348         {
4349             if(nlist[i].n_type & N_STAB)
4350                 ;
4351             else if(nlist[i].n_type & N_EXT)
4352             {
4353                 if((nlist[i].n_type & N_TYPE) == N_UNDF
4354                     && (nlist[i].n_value != 0))
4355                 {
4356                     commonSize += nlist[i].n_value;
4357                     oc->n_symbols++;
4358                 }
4359                 else if((nlist[i].n_type & N_TYPE) == N_SECT)
4360                     oc->n_symbols++;
4361             }
4362         }
4363     }
4364     oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
4365                                    "ocGetNames_MachO(oc->symbols)");
4366
4367     if(symLC)
4368     {
4369         for(i=0;i<symLC->nsyms;i++)
4370         {
4371             if(nlist[i].n_type & N_STAB)
4372                 ;
4373             else if((nlist[i].n_type & N_TYPE) == N_SECT)
4374             {
4375                 if(nlist[i].n_type & N_EXT)
4376                 {
4377                     char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
4378                     if((nlist[i].n_desc & N_WEAK_DEF) && lookupSymbol(nm))
4379                         ; // weak definition, and we already have a definition
4380                     else
4381                     {
4382                             ghciInsertStrHashTable(oc->fileName, symhash, nm,
4383                                                     image
4384                                                     + sections[nlist[i].n_sect-1].offset
4385                                                     - sections[nlist[i].n_sect-1].addr
4386                                                     + nlist[i].n_value);
4387                             oc->symbols[curSymbol++] = nm;
4388                     }
4389                 }
4390             }
4391         }
4392     }
4393
4394     commonStorage = stgCallocBytes(1,commonSize,"ocGetNames_MachO(common symbols)");
4395     commonCounter = (unsigned long)commonStorage;
4396     if(symLC)
4397     {
4398         for(i=0;i<symLC->nsyms;i++)
4399         {
4400             if((nlist[i].n_type & N_TYPE) == N_UNDF
4401                     && (nlist[i].n_type & N_EXT) && (nlist[i].n_value != 0))
4402             {
4403                 char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
4404                 unsigned long sz = nlist[i].n_value;
4405
4406                 nlist[i].n_value = commonCounter;
4407
4408                 ghciInsertStrHashTable(oc->fileName, symhash, nm,
4409                                        (void*)commonCounter);
4410                 oc->symbols[curSymbol++] = nm;
4411
4412                 commonCounter += sz;
4413             }
4414         }
4415     }
4416     return 1;
4417 }
4418
4419 static int ocResolve_MachO(ObjectCode* oc)
4420 {
4421     char *image = (char*) oc->image;
4422     struct mach_header *header = (struct mach_header*) image;
4423     struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
4424     unsigned i;
4425     struct segment_command *segLC = NULL;
4426     struct section *sections;
4427     struct symtab_command *symLC = NULL;
4428     struct dysymtab_command *dsymLC = NULL;
4429     struct nlist *nlist;
4430
4431     for(i=0;i<header->ncmds;i++)
4432     {
4433         if(lc->cmd == LC_SEGMENT || lc->cmd == LC_SEGMENT_64)
4434             segLC = (struct segment_command*) lc;
4435         else if(lc->cmd == LC_SYMTAB)
4436             symLC = (struct symtab_command*) lc;
4437         else if(lc->cmd == LC_DYSYMTAB)
4438             dsymLC = (struct dysymtab_command*) lc;
4439         lc = (struct load_command *) ( ((char*)lc) + lc->cmdsize );
4440     }
4441
4442     sections = (struct section*) (segLC+1);
4443     nlist = symLC ? (struct nlist*) (image + symLC->symoff)
4444                   : NULL;
4445
4446     if(dsymLC)
4447     {
4448         unsigned long *indirectSyms
4449             = (unsigned long*) (image + dsymLC->indirectsymoff);
4450
4451         for(i=0;i<segLC->nsects;i++)
4452         {
4453             if(    !strcmp(sections[i].sectname,"__la_symbol_ptr")
4454                 || !strcmp(sections[i].sectname,"__la_sym_ptr2")
4455                 || !strcmp(sections[i].sectname,"__la_sym_ptr3"))
4456             {
4457                 if(!resolveImports(oc,image,symLC,&sections[i],indirectSyms,nlist))
4458                     return 0;
4459             }
4460             else if(!strcmp(sections[i].sectname,"__nl_symbol_ptr")
4461                 ||  !strcmp(sections[i].sectname,"__pointers"))
4462             {
4463                 if(!resolveImports(oc,image,symLC,&sections[i],indirectSyms,nlist))
4464                     return 0;
4465             }
4466             else if(!strcmp(sections[i].sectname,"__jump_table"))
4467             {
4468                 if(!resolveImports(oc,image,symLC,&sections[i],indirectSyms,nlist))
4469                     return 0;
4470             }
4471         }
4472     }
4473     
4474     for(i=0;i<segLC->nsects;i++)
4475     {
4476         if(!relocateSection(oc,image,symLC,nlist,segLC->nsects,sections,&sections[i]))
4477             return 0;
4478     }
4479
4480     /* Free the local symbol table; we won't need it again. */
4481     freeHashTable(oc->lochash, NULL);
4482     oc->lochash = NULL;
4483
4484 #if defined (powerpc_HOST_ARCH)
4485     ocFlushInstructionCache( oc );
4486 #endif
4487
4488     return 1;
4489 }
4490
4491 #ifdef powerpc_HOST_ARCH
4492 /*
4493  * The Mach-O object format uses leading underscores. But not everywhere.
4494  * There is a small number of runtime support functions defined in
4495  * libcc_dynamic.a whose name does not have a leading underscore.
4496  * As a consequence, we can't get their address from C code.
4497  * We have to use inline assembler just to take the address of a function.
4498  * Yuck.
4499  */
4500
4501 static void machoInitSymbolsWithoutUnderscore()
4502 {
4503     extern void* symbolsWithoutUnderscore[];
4504     void **p = symbolsWithoutUnderscore;
4505     __asm__ volatile(".globl _symbolsWithoutUnderscore\n.data\n_symbolsWithoutUnderscore:");
4506
4507 #undef Sym
4508 #define Sym(x)  \
4509     __asm__ volatile(".long " # x);
4510
4511     RTS_MACHO_NOUNDERLINE_SYMBOLS
4512
4513     __asm__ volatile(".text");
4514     
4515 #undef Sym
4516 #define Sym(x)  \
4517     ghciInsertStrHashTable("(GHCi built-in symbols)", symhash, #x, *p++);
4518     
4519     RTS_MACHO_NOUNDERLINE_SYMBOLS
4520     
4521 #undef Sym
4522 }
4523 #endif
4524
4525 /*
4526  * Figure out by how much to shift the entire Mach-O file in memory
4527  * when loading so that its single segment ends up 16-byte-aligned
4528  */
4529 static int machoGetMisalignment( FILE * f )
4530 {
4531     struct mach_header header;
4532     int misalignment;
4533     
4534     fread(&header, sizeof(header), 1, f);
4535     rewind(f);
4536
4537 #if x86_64_TARGET_ARCH || powerpc64_TARGET_ARCH
4538     if(header.magic != MH_MAGIC_64)
4539         return 0;
4540 #else
4541     if(header.magic != MH_MAGIC)
4542         return 0;
4543 #endif
4544
4545     misalignment = (header.sizeofcmds + sizeof(header))
4546                     & 0xF;
4547
4548     return misalignment ? (16 - misalignment) : 0;
4549 }
4550
4551 #endif
4552