• Michael Pratt's avatar
    cmd/link: skip R_ADDR relocs in .rela.plt for internal PIE · 123fd464
    Michael Pratt authored
    ld.addpltsym adds an R_X86_64_JMP_SLOT dynamic relocation to .rela.plt
    and uses Addaddrplus to reference the GOT in Elf64_Rela.r_offset.
    
    Addaddrplus results in an R_ADDR relocation, which here we transform
    into an R_X86_64_64 dynamic relocation. This is wrong for several
    reasons:
    
    1. .rela.plt is not a writable, relro section. It is mapped read-only,
       causing the dynamic linker to segfault when it tried to handle the
       relocation. This was the immediate cause of internal PIE cgo
       crashes.
    
    2. Relocations targetting other reloc sections are, as far as I can
       tell, undefined behavior in the ELF spec and are unlikely to be a
       good idea.
    
    3. Even if the relocation did work, it isn't what we want. The
       relocation, if successfully handled, would have put an absolute
       address as the JMP_SLOT offset, but it should be the offset from the
       beginning of the binary, just like any other relocation. What we want
       is a statically resolved R_ADDR relocation, just as is used below for
       the R_X86_64_64 relocation.
    
    Skipping the .rela.plt allows reloc() to handle these R_ADDR
    relocations.
    
    With this CL, internal PIE cgo binaries work.
    
    Updates #18968
    
    Change-Id: Ie74e6fe249e88150baa0e340b1cb128cf7f28673
    Reviewed-on: https://go-review.googlesource.com/47837Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    123fd464
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...