in rts/Linker.c [1154:1225]
void freeObjectCode (ObjectCode *oc)
{
freePreloadObjectFile(oc);
if (oc->symbols != NULL) {
stgFree(oc->symbols);
oc->symbols = NULL;
}
if (oc->extraInfos != NULL) {
freeHashTable(oc->extraInfos, NULL);
oc->extraInfos = NULL;
}
if (oc->sections != NULL) {
int i;
for (i=0; i < oc->n_sections; i++) {
if (oc->sections[i].start != NULL) {
switch(oc->sections[i].alloc){
#if RTS_LINKER_USE_MMAP
case SECTION_MMAP:
munmap(oc->sections[i].mapped_start,
oc->sections[i].mapped_size);
break;
case SECTION_M32:
m32_free(oc->sections[i].start,
oc->sections[i].size);
break;
#endif
case SECTION_MALLOC:
stgFree(oc->sections[i].start);
break;
default:
break;
}
}
if (oc->sections[i].info) {
stgFree(oc->sections[i].info);
}
}
stgFree(oc->sections);
}
freeProddableBlocks(oc);
/* Free symbol_extras. On x86_64 Windows, symbol_extras are allocated
* alongside the image, so we don't need to free. */
#if defined(NEED_SYMBOL_EXTRAS) && (!defined(x86_64_HOST_ARCH) \
|| !defined(mingw32_HOST_OS))
if (RTS_LINKER_USE_MMAP) {
if (!USE_CONTIGUOUS_MMAP && !RtsFlags.MiscFlags.linkerAlwaysPic &&
oc->symbol_extras != NULL) {
m32_free(oc->symbol_extras, sizeof(SymbolExtra) * oc->n_symbol_extras);
}
}
else {
stgFree(oc->symbol_extras);
}
#endif
#if defined(OBJECTFORMAT_MACHO)
ocDeinit_MachO(oc);
#endif
#if defined(OBJFORMAT_ELF)
ocDeinit_ELF(oc);
#endif
stgFree(oc->fileName);
stgFree(oc->archiveMemberName);
stgFree(oc);
}