[llvm-objcopy] Add support for visibility
I have no clue how this was missed when symbol table support was added. This change ensures that the visibility of symbols is preserved by default. llvm-svn: 321681
This commit is contained in:
parent
7c907061aa
commit
30d927a128
|
@ -28,11 +28,22 @@ Symbols:
|
|||
Section: .text
|
||||
Value: 0x1000
|
||||
Size: 4
|
||||
- Name: bam
|
||||
Type: STT_FUNC
|
||||
Section: .text
|
||||
Value: 0x1001
|
||||
Size: 4
|
||||
Visibility: STV_HIDDEN
|
||||
- Name: foo
|
||||
Type: STT_FUNC
|
||||
Section: .text
|
||||
Section: .text
|
||||
Value: 0x1004
|
||||
- Name: faz
|
||||
Type: STT_OBJECT
|
||||
Section: .data
|
||||
Value: 0x2002
|
||||
Size: 2
|
||||
Visibility: STV_INTERNAL
|
||||
- Name: bar
|
||||
Type: STT_OBJECT
|
||||
Section: .data
|
||||
|
@ -64,6 +75,17 @@ Symbols:
|
|||
#CHECK-NEXT: Section: .text
|
||||
#CHECK-NEXT: }
|
||||
#CHECK-NEXT: Symbol {
|
||||
#CHECK-NEXT: Name: bam
|
||||
#CHECK-NEXT: Value: 0x1001
|
||||
#CHECK-NEXT: Size: 4
|
||||
#CHECK-NEXT: Binding: Global
|
||||
#CHECK-NEXT: Type: Function
|
||||
#CHECK-NEXT: Other [
|
||||
#CHECK-NEXT: STV_HIDDEN
|
||||
#CHECK-NEXT: ]
|
||||
#CHECK-NEXT: Section: .text
|
||||
#CHECK-NEXT: }
|
||||
#CHECK-NEXT: Symbol {
|
||||
#CHECK-NEXT: Name: foo
|
||||
#CHECK-NEXT: Value: 0x1004
|
||||
#CHECK-NEXT: Size: 0
|
||||
|
@ -73,6 +95,17 @@ Symbols:
|
|||
#CHECK-NEXT: Section: .text
|
||||
#CHECK-NEXT: }
|
||||
#CHECK-NEXT: Symbol {
|
||||
#CHECK-NEXT: Name: faz
|
||||
#CHECK-NEXT: Value: 0x2002
|
||||
#CHECK-NEXT: Size: 2
|
||||
#CHECK-NEXT: Binding: Global
|
||||
#CHECK-NEXT: Type: Object
|
||||
#CHECK-NEXT: Other [
|
||||
#CHECK-NEXT: STV_INTERNAL
|
||||
#CHECK-NEXT: ]
|
||||
#CHECK-NEXT: Section: .data
|
||||
#CHECK-NEXT: }
|
||||
#CHECK-NEXT: Symbol {
|
||||
#CHECK-NEXT: Name: bar
|
||||
#CHECK-NEXT: Value: 0x2000
|
||||
#CHECK-NEXT: Size: 4
|
||||
|
|
|
@ -141,7 +141,8 @@ uint16_t Symbol::getShndx() const {
|
|||
|
||||
void SymbolTableSection::addSymbol(StringRef Name, uint8_t Bind, uint8_t Type,
|
||||
SectionBase *DefinedIn, uint64_t Value,
|
||||
uint16_t Shndx, uint64_t Sz) {
|
||||
uint8_t Visibility, uint16_t Shndx,
|
||||
uint64_t Sz) {
|
||||
Symbol Sym;
|
||||
Sym.Name = Name;
|
||||
Sym.Binding = Bind;
|
||||
|
@ -154,6 +155,7 @@ void SymbolTableSection::addSymbol(StringRef Name, uint8_t Bind, uint8_t Type,
|
|||
Sym.ShndxType = SYMBOL_SIMPLE_INDEX;
|
||||
}
|
||||
Sym.Value = Value;
|
||||
Sym.Visibility = Visibility;
|
||||
Sym.Size = Sz;
|
||||
Sym.Index = Symbols.size();
|
||||
Symbols.emplace_back(llvm::make_unique<Symbol>(Sym));
|
||||
|
@ -221,6 +223,7 @@ void SymbolTableSectionImpl<ELFT>::writeSection(FileOutputBuffer &Out) const {
|
|||
Sym->st_name = Symbol->NameIndex;
|
||||
Sym->st_value = Symbol->Value;
|
||||
Sym->st_size = Symbol->Size;
|
||||
Sym->st_other = Symbol->Visibility;
|
||||
Sym->setBinding(Symbol->Binding);
|
||||
Sym->setType(Symbol->Type);
|
||||
Sym->st_shndx = Symbol->getShndx();
|
||||
|
@ -425,7 +428,7 @@ void Object<ELFT>::initSymbolTable(const object::ELFFile<ELFT> &ElfFile,
|
|||
}
|
||||
|
||||
SymTab->addSymbol(Name, Sym.getBinding(), Sym.getType(), DefSection,
|
||||
Sym.getValue(), Sym.st_shndx, Sym.st_size);
|
||||
Sym.getValue(), Sym.st_other, Sym.st_shndx, Sym.st_size);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -193,6 +193,7 @@ struct Symbol {
|
|||
uint64_t Size;
|
||||
uint8_t Type;
|
||||
uint64_t Value;
|
||||
uint8_t Visibility;
|
||||
|
||||
uint16_t getShndx() const;
|
||||
};
|
||||
|
@ -207,8 +208,8 @@ protected:
|
|||
public:
|
||||
void setStrTab(StringTableSection *StrTab) { SymbolNames = StrTab; }
|
||||
void addSymbol(StringRef Name, uint8_t Bind, uint8_t Type,
|
||||
SectionBase *DefinedIn, uint64_t Value, uint16_t Shndx,
|
||||
uint64_t Sz);
|
||||
SectionBase *DefinedIn, uint64_t Value, uint8_t Visibility,
|
||||
uint16_t Shndx, uint64_t Sz);
|
||||
void addSymbolNames();
|
||||
const SectionBase *getStrTab() const { return SymbolNames; }
|
||||
const Symbol *getSymbolByIndex(uint32_t Index) const;
|
||||
|
|
Loading…
Reference in New Issue