Skip to content
Snippets Groups Projects
Commit 20a0163b authored by Ben Gamari's avatar Ben Gamari Committed by Matthew Pickering
Browse files

rts/PEi386: Fix handling of weak symbols

Previously we would flag the symbol as weak but failed
to set its address, which must be computed from an "auxiliary"
symbol entry the follows the weak symbol.

Fixes #21556.

(cherry picked from commit 53b3fa1c)
parent d23e91bd
No related branches found
No related tags found
No related merge requests found
......@@ -1657,6 +1657,13 @@ ocGetNames_PEi386 ( ObjectCode* oc )
}
else if (symStorageClass == IMAGE_SYM_CLASS_WEAK_EXTERNAL) {
isWeak = true;
CHECK(getSymNumberOfAuxSymbols (info, sym) == 1);
CHECK(symValue == 0);
COFF_symbol_aux_weak_external *aux = (COFF_symbol_aux_weak_external *) (sym+1);
COFF_symbol* targetSym = &oc->info->symbols[aux->TagIndex];
int32_t targetSecNumber = getSymSectionNumber (info, targetSym);
Section *targetSection = targetSecNumber > 0 ? &oc->sections[targetSecNumber-1] : NULL;
addr = (SymbolAddr*) ((size_t) targetSection->start + getSymValue(info, targetSym));
}
else if ( secNumber == IMAGE_SYM_UNDEFINED && symValue > 0) {
/* This symbol isn't in any section at all, ie, global bss.
......
......@@ -117,6 +117,12 @@ union _COFF_symbol {
COFF_symbol_ex ex;
} COFF_symbol;
typedef
struct {
uint32_t TagIndex;
uint32_t Characteristics;
} COFF_symbol_aux_weak_external;
/* A record for storing handles into DLLs. */
typedef
struct _OpenedDLL {
......
......@@ -42,8 +42,6 @@ test('ghcilink006',
test('T3333',
[unless(doing_ghci, skip),
unless(opsys('linux') or opsys('darwin') or ghc_dynamic(),
expect_broken(3333)),
when(unregisterised(), fragile(17018))],
makefile_test, ['T3333'])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment