diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h --- a/bolt/include/bolt/Core/BinaryContext.h +++ b/bolt/include/bolt/Core/BinaryContext.h @@ -585,6 +585,9 @@ /// Indicates if relocations are available for usage. bool HasRelocations{false}; + /// Indicates if the binary is stripped + bool IsStripped{false}; + /// Is the binary always loaded at a fixed address. Shared objects and /// position-independent executables (PIEs) are examples of binaries that /// will have HasFixedLoadAddress set to false. diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp --- a/bolt/lib/Rewrite/RewriteInstance.cpp +++ b/bolt/lib/Rewrite/RewriteInstance.cpp @@ -1562,6 +1562,7 @@ TimerGroupName, TimerGroupDesc, opts::TimeRewrite); bool HasTextRelocations = false; + bool HasSymbolTable = false; bool HasDebugInfo = false; // Process special sections. @@ -1593,6 +1594,7 @@ } HasTextRelocations = (bool)BC->getUniqueSectionByName(".rela.text"); + HasSymbolTable = (bool)BC->getUniqueSectionByName(".symtab"); LSDASection = BC->getUniqueSectionByName(".gcc_except_table"); EHFrameSection = BC->getUniqueSectionByName(".eh_frame"); GOTPLTSection = BC->getUniqueSectionByName(".got.plt"); @@ -1629,6 +1631,8 @@ BC->HasRelocations = HasTextRelocations && (opts::RelocationMode != cl::BOU_FALSE); + BC->IsStripped = !HasSymbolTable; + // Force non-relocation mode for heatmap generation if (opts::HeatmapMode) BC->HasRelocations = false; @@ -1637,6 +1641,10 @@ outs() << "BOLT-INFO: enabling " << (opts::StrictMode ? "strict " : "") << "relocation mode\n"; + if (BC->IsStripped) + outs() << "BOLT-INFO: input binary is stripped. The support is limited and " + << "is considered experimental.\n"; + // Read EH frame for function boundaries info. Expected EHFrameOrError = BC->DwCtx->getEHFrame(); if (!EHFrameOrError) diff --git a/bolt/test/X86/is-strip.s b/bolt/test/X86/is-strip.s new file mode 100644 --- /dev/null +++ b/bolt/test/X86/is-strip.s @@ -0,0 +1,10 @@ +# This test checks whether a binary is stripped or not. + +# RUN: %clang++ %p/Inputs/linenumber.cpp -o %t -Wl,-q +# RUN: llvm-bolt %t -o %t.out 2>&1 | FileCheck %s -check-prefix=CHECK-NOSTRIP +# RUN: cp %t %t.stripped +# RUN: llvm-strip -s %t.stripped +# RUN: llvm-bolt %t.stripped -o %t.out 2>&1 | FileCheck %s -check-prefix=CHECK-STRIP + +# CHECK-NOSTRIP-NOT: BOLT-INFO: input binary is stripped. The support is limited and is considered experimental. +# CHECK-STRIP: BOLT-INFO: input binary is stripped. The support is limited and is considered experimental.