[llvm-objcopy] Fix bug in how segment alignment was being handled
authorJake Ehrlich <jakehehrlich@google.com>
Thu, 2 Nov 2017 23:24:04 +0000 (23:24 +0000)
committerJake Ehrlich <jakehehrlich@google.com>
Thu, 2 Nov 2017 23:24:04 +0000 (23:24 +0000)
commit13153eef561c5eb3295e1d0f3018ff32b54510af
tree08d75e8f895fe9076c7fb099adefc6da24e3b1bb
parent086c04c8a795778f60a243f080e18bca3a4de144
[llvm-objcopy] Fix bug in how segment alignment was being handled

Just aligning segment offsets to segment alignment is incorrect and also
wastes more space than is needed. The requirement is that p_offset ==
p_addr modulo p_align *not* that p_offset == 0 modulo p_align. Generally
speaking we've been using p_addr == 0 modulo p_align. In fact yaml2obj
can't even produce a valid situation which causes llvm-objcopy to
produce incorrect results because alignment and offset were both
inherited from the sections the program header covers. This change fixes
this bad behavior in llvm-objcopy.

Differential Revision: https://reviews.llvm.org/D39132

llvm-svn: 317284
llvm/test/tools/llvm-objcopy/check-addr-offset-align-binary.test [new file with mode: 0644]
llvm/test/tools/llvm-objcopy/check-addr-offset-align.test [new file with mode: 0644]
llvm/tools/llvm-objcopy/Object.cpp