]> granicus.if.org Git - llvm/commitdiff
[llvm-objcopy] Add support for visibility
authorJake Ehrlich <jakehehrlich@google.com>
Tue, 2 Jan 2018 23:01:24 +0000 (23:01 +0000)
committerJake Ehrlich <jakehehrlich@google.com>
Tue, 2 Jan 2018 23:01:24 +0000 (23:01 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321681 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-objcopy/symbol-copy.test
tools/llvm-objcopy/Object.cpp
tools/llvm-objcopy/Object.h

index 83e2c0ea70a672d78b51785240b20d18ef7f93c9..3e346701fb93d79ece804420516460f6c7e3ccb2 100644 (file)
@@ -28,11 +28,22 @@ Symbols:
       Section:  .text
       Value:    0x1000
       Size:     4
-    - Name:     foo
+    - Name:     bam
       Type:     STT_FUNC
       Section:  .text
+      Value:    0x1001
+      Size:     4
+      Visibility: STV_HIDDEN
+    - Name:     foo
+      Type:     STT_FUNC
       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
index d5dfcac40e4e4680046c2e335d7466eb90bffc6d..9e82448187eafc9e784203dcef5bff3b2ad3a271 100644 (file)
@@ -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);
   }
 }
 
index b04b0c1a6415ba904a8c50c9f549471524840a94..639f0f29cebad464a01ab3da53da37102739ef6b 100644 (file)
@@ -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;