/* -----------------------------------------------------------------------------
- * $Id: Linker.c,v 1.52 2001/07/20 01:05:11 sof Exp $
+ * $Id: Linker.c,v 1.56 2001/08/13 14:34:40 simonmar Exp $
*
* (c) The GHC Team, 2000
*
SymX(newArrayzh_fast) \
SymX(unsafeThawArrayzh_fast) \
SymX(newByteArrayzh_fast) \
+ SymX(newPinnedByteArrayzh_fast) \
SymX(newMutVarzh_fast) \
SymX(quotRemIntegerzh_fast) \
SymX(quotIntegerzh_fast) \
if (sym != NULL) return sym;
}
return NULL;
+# else
+ ASSERT(2+2 == 5);
+ return NULL;
# endif
} else {
return val;
COFF_section* section_sym
= findPEi386SectionCalled ( oc, sym->Name );
if (!section_sym) {
- fprintf ( stderr, "bad section = `%s'\n", sym->Name );
- barf("Can't find abovementioned PEi386 section");
+ belch("%s: can't find section `%s'", oc->fileName, sym->Name);
return 0;
}
S = ((UInt32)(oc->image))
if ((void*)S == NULL)
(void*)S = lookupSymbol( symbol );
if (S == 0) {
- belch("ocResolve_PEi386: %s: unknown symbol `%s'",
- oc->fileName, symbol);
+ belch("%s: unknown symbol `%s'", oc->fileName, symbol);
return 0;
}
}
*pP = S - ((UInt32)pP) - 4;
break;
default:
- fprintf(stderr,
- "unhandled PEi386 relocation type %d\n",
- reltab_j->Type);
- barf("unhandled PEi386 relocation type");
+ belch("%s: unhandled PEi386 relocation type %d",
+ oc->fileName, reltab_j->Type);
return 0;
}
}
}
- /* fprintf(stderr, "completed %s\n", oc->fileName); */
+ IF_DEBUG(linker, belch("completed %s", oc->fileName));
return 1;
}
#if defined(sparc_TARGET_ARCH)
# define ELF_TARGET_SPARC /* Used inside <elf.h> */
+#elif defined(i386_TARGET_ARCH)
+# define ELF_TARGET_386 /* Used inside <elf.h> */
#endif
+/* There is a similar case for IA64 in the Solaris2 headers if this
+ * ever becomes relevant.
+ */
#include <elf.h>
ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
ehdr->e_ident[EI_MAG3] != ELFMAG3) {
- belch("ocVerifyImage_ELF: not an ELF header");
+ belch("%s: not an ELF header", oc->fileName);
return 0;
}
IF_DEBUG(linker,belch( "Is an ELF header" ));
if (ehdr->e_ident[EI_CLASS] != ELFCLASS32) {
- belch("ocVerifyImage_ELF: not 32 bit ELF" );
+ belch("%s: not 32 bit ELF", oc->fileName);
return 0;
}
if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
IF_DEBUG(linker,belch( "Is big-endian" ));
} else {
- belch("ocVerifyImage_ELF: unknown endiannness");
+ belch("%s: unknown endiannness", oc->fileName);
return 0;
}
if (ehdr->e_type != ET_REL) {
- belch("ocVerifyImage_ELF: not a relocatable object (.o) file");
+ belch("%s: not a relocatable object (.o) file", oc->fileName);
return 0;
}
IF_DEBUG(linker, belch( "Is a relocatable object (.o) file" ));
case EM_386: IF_DEBUG(linker,belch( "x86" )); break;
case EM_SPARC: IF_DEBUG(linker,belch( "sparc" )); break;
default: IF_DEBUG(linker,belch( "unknown" ));
- belch("ocVerifyImage_ELF: unknown architecture");
+ belch("%s: unknown architecture", oc->fileName);
return 0;
}
shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
if (ehdr->e_shstrndx == SHN_UNDEF) {
- belch("ocVerifyImage_ELF: no section header string table");
+ belch("%s: no section header string table", oc->fileName);
return 0;
} else {
IF_DEBUG(linker,belch( "Section header string table is section %d",
}
}
if (nstrtab != 1) {
- belch("ocVerifyImage_ELF: no string tables, or too many");
+ belch("%s: no string tables, or too many", oc->fileName);
return 0;
}
shdr[i].sh_size % sizeof(Elf32_Sym)
));
if (0 != shdr[i].sh_size % sizeof(Elf32_Sym)) {
- belch("ocVerifyImage_ELF: non-integral number of symbol table entries");
+ belch("%s: non-integral number of symbol table entries", oc->fileName);
return 0;
}
for (j = 0; j < nent; j++) {
}
if (nsymtabs == 0) {
- belch("ocVerifyImage_ELF: didn't find any symbol tables");
+ belch("%s: didn't find any symbol tables", oc->fileName);
return 0;
}
ASSERT(symhash != NULL);
if (!strtab) {
- belch("ocGetNames_ELF: no strtab");
+ belch("%s: no strtab", oc->fileName);
return 0;
}
/* Do ELF relocations which lack an explicit addend. All x86-linux
relocations appear to be of this form. */
-static int do_Elf32_Rel_relocations ( ObjectCode* oc, char* ehdrC,
- Elf32_Shdr* shdr, int shnum,
- Elf32_Sym* stab, char* strtab )
+static int
+do_Elf32_Rel_relocations ( ObjectCode* oc, char* ehdrC,
+ Elf32_Shdr* shdr, int shnum,
+ Elf32_Sym* stab, char* strtab )
{
int j;
char *symbol;
(void*)S = lookupSymbol( symbol );
}
if (!S) {
- barf("do_Elf32_Rel_relocations: %s: unknown symbol `%s'",
- oc->fileName, symbol);
+ belch("%s: unknown symbol `%s'", oc->fileName, symbol);
+ return 0;
}
IF_DEBUG(linker,belch( "`%s' resolves to %p", symbol, (void*)S ));
}
case R_386_PC32: *pP = S + A - P; break;
# endif
default:
- fprintf(stderr, "unhandled ELF relocation(Rel) type %d\n",
- ELF32_R_TYPE(info));
- barf("do_Elf32_Rel_relocations: unhandled ELF relocation type");
+ belch("%s: unhandled ELF relocation(Rel) type %d\n",
+ oc->fileName, ELF32_R_TYPE(info));
return 0;
}
/* Do ELF relocations for which explicit addends are supplied.
sparc-solaris relocations appear to be of this form. */
-static int do_Elf32_Rela_relocations ( ObjectCode* oc, char* ehdrC,
- Elf32_Shdr* shdr, int shnum,
- Elf32_Sym* stab, char* strtab )
+static int
+do_Elf32_Rela_relocations ( ObjectCode* oc, char* ehdrC,
+ Elf32_Shdr* shdr, int shnum,
+ Elf32_Sym* stab, char* strtab )
{
int j;
char *symbol;
(void*)S = lookupSymbol( symbol );
}
if (!S) {
- barf("do_Elf32_Rela_relocations: %s: unknown symbol `%s'",
- oc->fileName, symbol);
+ belch("%s: unknown symbol `%s'", oc->fileName, symbol);
+ return 0;
/*
S = 0x11223344;
fprintf ( stderr, "S %p A %p S+A %p S+A-P %p\n",S,A,S+A,S+A-P);
break;
# endif
default:
- fprintf(stderr, "unhandled ELF relocation(RelA) type %d\n",
- ELF32_R_TYPE(info));
- barf("do_Elf32_Rela_relocations: unhandled ELF relocation type");
+ belch("%s: unhandled ELF relocation(RelA) type %d\n",
+ oc->fileName, ELF32_R_TYPE(info));
return 0;
}
strtab = findElfSection ( ehdrC, SHT_STRTAB );
if (stab == NULL || strtab == NULL) {
- belch("ocResolve_ELF: can't find string or symbol table");
+ belch("%s: can't find string or symbol table", oc->fileName);
return 0;
}