[MC] Emit unused undefined symbol even if its binding is not set

Recommit r373168, which was reverted by r373242. This actually exposed a
boringssl bug which has been fixed for more than one month.

For the following two cases, we currently suppress the symbols. This
patch emits them (compatible with GNU as).

* `test2_a = undef`: if `undef` is otherwise unused.
* `.hidden hidden`: if `hidden` is unused. This is the main point of the
  patch, because omitting the symbol would cause a linker semantic
  difference.

It causes a behavior change that is not compatible with GNU as:

.weakref foo1, bar1

When neither foo1 nor bar1 is used, we now emit bar1, which is arguably
more consistent.

Another change is that we will emit .TOC. for .TOC.@tocbase .  For this
directive, suppressing .TOC. can be seen as a size optimization, but we
choose to drop it for simplicity and consistency.
This commit is contained in:
Fangrui Song 2019-09-29 15:26:12 +00:00
parent 3a7a22445e
commit 8f089f2099
5 changed files with 37 additions and 9 deletions

View File

@ -12,10 +12,10 @@
## FIXME the addend for offset 0x20000 should be TOC base+0x8000+1, not 0x80001.
# CHECK: .rela.dyn {
# CHECK-NEXT: 0x303B0 R_PPC64_RELATIVE - 0x8001
# CHECK-NEXT: 0x303B8 R_PPC64_RELATIVE - 0x303B1
# CHECK-NEXT: 0x303C0 R_PPC64_ADDR64 external 0x1
# CHECK-NEXT: 0x303C8 R_PPC64_ADDR64 global 0x1
# CHECK-NEXT: 0x303B8 R_PPC64_RELATIVE - 0x8001
# CHECK-NEXT: 0x303C0 R_PPC64_RELATIVE - 0x303B9
# CHECK-NEXT: 0x303C8 R_PPC64_ADDR64 external 0x1
# CHECK-NEXT: 0x303D0 R_PPC64_ADDR64 global 0x1
# CHECK-NEXT: }
.data

View File

@ -26,13 +26,13 @@ _start:
ld 1, .L1@toc@l(2)
# CHECK-LABEL: Disassembly of section .R_PPC64_TOC16_LO_DS:
# CHECK: ld 1, -32768(2)
# CHECK: ld 1, -32760(2)
.section .R_PPC64_TOC16_LO,"ax",@progbits
addi 1, 2, .L1@toc@l
# CHECK-LABEL: Disassembly of section .R_PPC64_TOC16_LO:
# CHECK: addi 1, 2, -32768
# CHECK: addi 1, 2, -32760
.section .R_PPC64_TOC16_HI,"ax",@progbits
addis 1, 2, .L1@toc@h

View File

@ -615,9 +615,6 @@ bool ELFWriter::isInSymtab(const MCAsmLayout &Layout, const MCSymbolELF &Symbol,
return false;
}
if (Symbol.isUndefined() && !Symbol.isBindingSet())
return false;
if (Symbol.isTemporary())
return false;

View File

@ -18,6 +18,8 @@
.text
movsd .Lsym8(%rip), %xmm1
.hidden hidden
test2_a = undef
test2_b = undef + 1
@ -41,6 +43,17 @@ test2_b = undef + 1
// CHECK-NEXT: Section: .rodata.str1.1
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: hidden
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other [
// CHECK-NEXT: STV_HIDDEN
// CHECK-NEXT: ]
// CHECK-NEXT: Section: Undefined
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: sym6
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
@ -49,4 +62,13 @@ test2_b = undef + 1
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: Undefined
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: undef
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: Undefined
// CHECK-NEXT: }
// CHECK-NEXT: ]

View File

@ -125,6 +125,15 @@ bar15:
// CHECK-NEXT: Section: .text
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: bar1
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Global
// CHECK-NEXT: Type: None
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: Undefined
// CHECK-NEXT: }
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: bar10
// CHECK-NEXT: Value: 0x28
// CHECK-NEXT: Size: 0