LLVM 22.0.0git
ELFObjcopy.cpp File Reference
#include "llvm/ObjCopy/ELF/ELFObjcopy.h"
#include "ELFObject.h"
#include "llvm/ADT/BitmaskEnum.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/ObjCopy/CommonConfig.h"
#include "llvm/ObjCopy/ELF/ELFConfig.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Object/ELFTypes.h"
#include "llvm/Object/Error.h"
#include "llvm/Option/Option.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compression.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Memory.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <functional>
#include <memory>
#include <string>
#include <system_error>
#include <utility>

Go to the source code of this file.

Typedefs

using SectionPred = std::function<bool(const SectionBase &Sec)>

Functions

static bool isDebugSection (const SectionBase &Sec)
static bool isDWOSection (const SectionBase &Sec)
static bool onlyKeepDWOPred (const Object &Obj, const SectionBase &Sec)
static Expected< uint64_tgetNewShfFlags (SectionFlag AllFlags, uint16_t EMachine)
static uint64_t getSectionFlagsPreserveMask (uint64_t OldFlags, uint64_t NewFlags, uint16_t EMachine)
static void setSectionType (SectionBase &Sec, uint64_t Type)
static Error setSectionFlagsAndType (SectionBase &Sec, SectionFlag Flags, uint16_t EMachine)
static ElfType getOutputElfType (const Binary &Bin)
static ElfType getOutputElfType (const MachineInfo &MI)
static std::unique_ptr< WritercreateELFWriter (const CommonConfig &Config, Object &Obj, raw_ostream &Out, ElfType OutputElfType)
static std::unique_ptr< WritercreateWriter (const CommonConfig &Config, Object &Obj, raw_ostream &Out, ElfType OutputElfType)
static Error dumpSectionToFile (StringRef SecName, StringRef Filename, StringRef InputFilename, Object &Obj)
static bool isAArch64MappingSymbol (const Symbol &Sym)
static bool isArmMappingSymbol (const Symbol &Sym)
static bool isRequiredByABISymbol (const Object &Obj, const Symbol &Sym)
static bool isUnneededSymbol (const Symbol &Sym)
static Error updateAndRemoveSymbols (const CommonConfig &Config, const ELFConfig &ELFConfig, Object &Obj)
static Error replaceAndRemoveSections (const CommonConfig &Config, const ELFConfig &ELFConfig, Object &Obj)
static void addSymbol (Object &Obj, const NewSymbolInfo &SymInfo, uint8_t DefaultVisibility)
static Error removeNotes (Object &Obj, endianness Endianness, ArrayRef< RemoveNoteInfo > NotesToRemove, function_ref< Error(Error)> ErrorCallback)
static Error handleUserSection (const NewSectionInfo &NewSection, function_ref< Error(StringRef, ArrayRef< uint8_t >)> F)
static Error verifyNoteSection (StringRef Name, endianness Endianness, ArrayRef< uint8_t > Data)
static Error handleArgs (const CommonConfig &Config, const ELFConfig &ELFConfig, ElfType OutputElfType, Object &Obj)
static Error writeOutput (const CommonConfig &Config, Object &Obj, raw_ostream &Out, ElfType OutputElfType)

Typedef Documentation

◆ SectionPred

Definition at line 47 of file ELFObjcopy.cpp.

Function Documentation

◆ addSymbol()

◆ createELFWriter()

◆ createWriter()

std::unique_ptr< Writer > createWriter ( const CommonConfig & Config,
Object & Obj,
raw_ostream & Out,
ElfType OutputElfType )
static

◆ dumpSectionToFile()

◆ getNewShfFlags()

◆ getOutputElfType() [1/2]

◆ getOutputElfType() [2/2]

◆ getSectionFlagsPreserveMask()

◆ handleArgs()

Error handleArgs ( const CommonConfig & Config,
const ELFConfig & ELFConfig,
ElfType OutputElfType,
Object & Obj )
static

Definition at line 784 of file ELFObjcopy.cpp.

References llvm::objcopy::Add, llvm::objcopy::CommonConfig::AddGnuDebugLink, llvm::objcopy::elf::Object::addNewSymbolTable(), llvm::objcopy::CommonConfig::AddSection, llvm::objcopy::elf::Object::addSection(), addSymbol(), llvm::objcopy::CommonConfig::AllocSectionsPrefix, llvm::objcopy::ELFConfig::AllowBrokenLinks, llvm::big, llvm::objcopy::CommonConfig::ChangeSectionAddress, llvm::objcopy::CommonConfig::ChangeSectionLMAValAll, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::count(), llvm::createFileError(), llvm::Data, llvm::objcopy::CommonConfig::DumpSection, dumpSectionToFile(), llvm::dyn_cast(), E(), llvm::objcopy::elf::ELFT_ELF32LE, llvm::objcopy::elf::ELFT_ELF64LE, llvm::StringMapImpl::empty(), llvm::StringRef::empty(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::end(), llvm::StringMap< ValueTy, AllocatorTy >::end(), llvm::objcopy::elf::Object::Entry, llvm::objcopy::ELFConfig::EntryExpr, llvm::objcopy::CommonConfig::ErrorCallback, llvm::ELF::ET_REL, llvm::objcopy::CommonConfig::ExtractDWO, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::find(), llvm::StringMap< ValueTy, AllocatorTy >::find(), llvm::objcopy::elf::SectionBase::Flags, llvm::objcopy::CommonConfig::GnuDebugLinkCRC32, handleUserSection(), I, llvm::objcopy::CommonConfig::InputFilename, llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), llvm::invalid_argument, llvm::object::invalid_file_type, llvm::little, llvm::objcopy::elf::Object::Machine, llvm::objcopy::elf::SectionBase::Name, llvm::objcopy::SectionFlagsUpdate::NewFlags, llvm::objcopy::SectionRename::NewFlags, llvm::objcopy::SectionRename::NewName, llvm::objcopy::ELFConfig::NewSymbolVisibility, llvm::objcopy::ELFConfig::NotesToRemove, llvm::objcopy::CommonConfig::OnlyKeepDebug, llvm::objcopy::elf::Object::OSABI, llvm::objcopy::CommonConfig::OutputArch, removeNotes(), llvm::objcopy::elf::Object::removeSections(), replaceAndRemoveSections(), llvm::reverse(), llvm::objcopy::elf::Object::sections(), llvm::objcopy::CommonConfig::SectionsToRename, llvm::objcopy::elf::Object::segments(), llvm::objcopy::Set, llvm::objcopy::CommonConfig::SetSectionAlignment, llvm::objcopy::CommonConfig::SetSectionFlags, setSectionFlagsAndType(), llvm::objcopy::CommonConfig::SetSectionType, setSectionType(), llvm::ELF::SHF_ALLOC, llvm::ELF::SHT_NOBITS, llvm::ELF::SHT_NOTE, llvm::objcopy::CommonConfig::SplitDWO, llvm::objcopy::Subtract, llvm::Error::success(), llvm::objcopy::CommonConfig::SymbolsToAdd, llvm::objcopy::elf::Object::SymbolTable, llvm::StringMap< ValueTy, AllocatorTy >::try_emplace(), llvm::objcopy::elf::Object::Type, llvm::objcopy::elf::SectionBase::Type, updateAndRemoveSymbols(), llvm::objcopy::CommonConfig::UpdateSection, llvm::objcopy::elf::Object::updateSection(), llvm::Twine::utohexstr(), verifyNoteSection(), and llvm::objcopy::ELFConfig::VerifyNoteSections.

Referenced by llvm::objcopy::elf::executeObjcopyOnBinary(), llvm::objcopy::elf::executeObjcopyOnIHex(), and llvm::objcopy::elf::executeObjcopyOnRawBinary().

◆ handleUserSection()

Error handleUserSection ( const NewSectionInfo & NewSection,
function_ref< Error(StringRef, ArrayRef< uint8_t >)> F )
static

◆ isAArch64MappingSymbol()

bool isAArch64MappingSymbol ( const Symbol & Sym)
static

Definition at line 259 of file ELFObjcopy.cpp.

References llvm::ELF::SHN_UNDEF, llvm::ELF::STB_LOCAL, and llvm::ELF::STT_NOTYPE.

Referenced by isRequiredByABISymbol().

◆ isArmMappingSymbol()

bool isArmMappingSymbol ( const Symbol & Sym)
static

Definition at line 269 of file ELFObjcopy.cpp.

References llvm::ELF::SHN_UNDEF, llvm::ELF::STB_LOCAL, and llvm::ELF::STT_NOTYPE.

Referenced by isRequiredByABISymbol().

◆ isDebugSection()

bool isDebugSection ( const SectionBase & Sec)
static

◆ isDWOSection()

bool isDWOSection ( const SectionBase & Sec)
static

◆ isRequiredByABISymbol()

◆ isUnneededSymbol()

bool isUnneededSymbol ( const Symbol & Sym)
static

◆ onlyKeepDWOPred()

bool onlyKeepDWOPred ( const Object & Obj,
const SectionBase & Sec )
static

Definition at line 57 of file ELFObjcopy.cpp.

References isDWOSection(), and llvm::objcopy::elf::Object::SectionNames.

Referenced by replaceAndRemoveSections().

◆ removeNotes()

◆ replaceAndRemoveSections()

Error replaceAndRemoveSections ( const CommonConfig & Config,
const ELFConfig & ELFConfig,
Object & Obj )
static

◆ setSectionFlagsAndType()

◆ setSectionType()

◆ updateAndRemoveSymbols()

Error updateAndRemoveSymbols ( const CommonConfig & Config,
const ELFConfig & ELFConfig,
Object & Obj )
static

Definition at line 300 of file ELFObjcopy.cpp.

References llvm::objcopy::All, llvm::objcopy::CommonConfig::DiscardMode, llvm::objcopy::NameMatcher::empty(), llvm::StringRef::empty(), I, llvm::objcopy::elf::Object::isRelocatable(), isRequiredByABISymbol(), isUnneededSymbol(), llvm::objcopy::ELFConfig::KeepFileSymbols, llvm::objcopy::ELFConfig::LocalizeHidden, llvm::objcopy::Locals, llvm::objcopy::NameMatcher::matches(), llvm::objcopy::None, llvm::objcopy::CommonConfig::OnlySection, llvm::objcopy::elf::Object::removeSymbols(), llvm::objcopy::elf::Object::sections(), llvm::ELF::SHN_UNDEF, llvm::StringRef::size(), llvm::StringRef::starts_with(), llvm::ELF::STB_GLOBAL, llvm::ELF::STB_LOCAL, llvm::ELF::STB_WEAK, llvm::objcopy::CommonConfig::StripAll, llvm::objcopy::CommonConfig::StripAllGNU, llvm::objcopy::CommonConfig::StripDebug, llvm::objcopy::CommonConfig::StripUnneeded, llvm::ELF::STT_FILE, llvm::ELF::STT_SECTION, llvm::ELF::STV_HIDDEN, llvm::ELF::STV_INTERNAL, llvm::Error::success(), llvm::objcopy::CommonConfig::SymbolsPrefix, llvm::objcopy::CommonConfig::SymbolsPrefixRemove, llvm::objcopy::CommonConfig::SymbolsToGlobalize, llvm::objcopy::CommonConfig::SymbolsToKeep, llvm::objcopy::CommonConfig::SymbolsToKeepGlobal, llvm::objcopy::CommonConfig::SymbolsToLocalize, llvm::objcopy::CommonConfig::SymbolsToRemove, llvm::objcopy::CommonConfig::SymbolsToRename, llvm::objcopy::ELFConfig::SymbolsToSetVisibility, llvm::objcopy::CommonConfig::SymbolsToSkip, llvm::objcopy::CommonConfig::SymbolsToWeaken, llvm::objcopy::elf::Object::SymbolTable, llvm::objcopy::CommonConfig::UnneededSymbolsToRemove, llvm::objcopy::elf::SymbolTableSection::updateSymbols(), and llvm::objcopy::CommonConfig::Weaken.

Referenced by handleArgs().

◆ verifyNoteSection()

◆ writeOutput()