diff options
| -rw-r--r-- | lld/lib/Core/Resolver.cpp | 7 | ||||
| -rw-r--r-- | lld/test/core/absolute-basic.objtxt | 2 |
2 files changed, 7 insertions, 2 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index 63c2b317f48..ff217f248ea 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -383,11 +383,16 @@ void Resolver::deadStripOptimize() { // Some type of references prevent referring atoms to be dead-striped. // Make a reverse map of such references before traversing the graph. - for (const Atom *atom : _atoms) + // While traversing the list of atoms, mark AbsoluteAtoms as live + // in order to avoid reclaim. + for (const Atom *atom : _atoms) { if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom)) for (const Reference *ref : *defAtom) if (isBackref(ref)) _reverseRef[ref->target()].insert(atom); + if (const AbsoluteAtom *absAtom = dyn_cast<AbsoluteAtom>(atom)) + markLive(absAtom); + } // By default, shared libraries are built with all globals as dead strip roots if (_context.globalsAreDeadStripRoots()) diff --git a/lld/test/core/absolute-basic.objtxt b/lld/test/core/absolute-basic.objtxt index af64794514a..edfbe8629b0 100644 --- a/lld/test/core/absolute-basic.objtxt +++ b/lld/test/core/absolute-basic.objtxt @@ -1,4 +1,4 @@ -# RUN: lld -core %s | FileCheck %s +# RUN: lld -core --dead-strip %s | FileCheck %s # # Test that absolute symbols are parsed and preserved |

