+ if (end >= start) {
+ addSection(oc, kind, start, end);
+ addProddableBlock(oc, start, end - start + 1);
+ }
+ }
+
+ /* Copy exported symbols into the ObjectCode. */
+
+ oc->n_symbols = hdr->NumberOfSymbols;
+ oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
+ "ocGetNames_PEi386(oc->symbols)");
+ /* Call me paranoid; I don't care. */
+ for (i = 0; i < oc->n_symbols; i++)
+ oc->symbols[i] = NULL;
+
+ i = 0;
+ while (1) {
+ COFF_symbol* symtab_i;
+ if (i >= (Int32)(hdr->NumberOfSymbols)) break;
+ symtab_i = (COFF_symbol*)
+ myindex ( sizeof_COFF_symbol, symtab, i );
+
+ addr = NULL;
+
+ if (symtab_i->StorageClass == MYIMAGE_SYM_CLASS_EXTERNAL
+ && symtab_i->SectionNumber != MYIMAGE_SYM_UNDEFINED) {
+ /* This symbol is global and defined, viz, exported */
+ /* for MYIMAGE_SYMCLASS_EXTERNAL
+ && !MYIMAGE_SYM_UNDEFINED,
+ the address of the symbol is:
+ address of relevant section + offset in section
+ */
+ COFF_section* sectabent
+ = (COFF_section*) myindex ( sizeof_COFF_section,
+ sectab,
+ symtab_i->SectionNumber-1 );
+ addr = ((UChar*)(oc->image))
+ + (sectabent->PointerToRawData
+ + symtab_i->Value);
+ }
+ else
+ if (symtab_i->SectionNumber == MYIMAGE_SYM_UNDEFINED
+ && symtab_i->Value > 0) {
+ /* This symbol isn't in any section at all, ie, global bss.
+ Allocate zeroed space for it. */
+ addr = stgCallocBytes(1, symtab_i->Value,
+ "ocGetNames_PEi386(non-anonymous bss)");
+ addSection(oc, SECTIONKIND_RWDATA, addr,
+ ((UChar*)addr) + symtab_i->Value - 1);
+ addProddableBlock(oc, addr, symtab_i->Value);
+ /* fprintf(stderr, "BSS section at 0x%x\n", addr); */
+ }
+
+ if (addr != NULL) {
+ sname = cstring_from_COFF_symbol_name ( symtab_i->Name, strtab );
+ /* fprintf(stderr,"addSymbol %p `%s'\n", addr,sname); */
+ IF_DEBUG(linker, belch("addSymbol %p `%s'\n", addr,sname);)
+ ASSERT(i >= 0 && i < oc->n_symbols);
+ /* cstring_from_COFF_symbol_name always succeeds. */
+ oc->symbols[i] = sname;
+ insertStrHashTable(symhash, sname, addr);
+ } else {
+# if 0
+ fprintf ( stderr,
+ "IGNORING symbol %d\n"
+ " name `",
+ i
+ );
+ printName ( symtab_i->Name, strtab );
+ fprintf ( stderr,
+ "'\n"
+ " value 0x%x\n"
+ " 1+sec# %d\n"
+ " type 0x%x\n"
+ " sclass 0x%x\n"
+ " nAux %d\n",
+ symtab_i->Value,
+ (Int32)(symtab_i->SectionNumber),
+ (UInt32)symtab_i->Type,
+ (UInt32)symtab_i->StorageClass,
+ (UInt32)symtab_i->NumberOfAuxSymbols
+ );
+# endif
+ }
+
+ i += symtab_i->NumberOfAuxSymbols;
+ i++;