[llvm-dev] [ELF] [RFC] Padding between executable sections

Martin J. O'Riordan via llvm-dev llvm-dev at lists.llvm.org
Fri Mar 10 08:39:06 PST 2017


With Gnu this is handled by the FILL command or using the ‘=N’ expression.  For example:

SECTIONS {

  .text : { *(.text) *(.text.*) } = 0xCC

}

I must admit, I haven’t yet used LLD, but I would have expected that it would be functionally equivalent to Gnu ld?

            MartinO

 

From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of James Henderson via llvm-dev
Sent: 10 March 2017 16:19
To: llvm-dev at lists.llvm.org
Subject: [llvm-dev] [ELF] [RFC] Padding between executable sections

 

Hi,

I was doing some experiments with LLD and noticed that it pads out OutputSections with null bytes in all cases (as far as I could tell). However, for executable sections on some targets, 0x00 forms part of an executable instruction that is not nop. In particular, for x86_64 targets at least, the sequence 0x00 0x00 is an add instruction. This can result in confusing disassembly.

For example, on x86_64, given a simple InputSection that is a single "0xc3 retq" instruction, and given an alignment of 16 bytes, 15 null bytes are inserted between the end of that InputSection and the next. In the disassembly I then see the retq instruction followed by a series of adds, the last of which actually consumes 1 or more bytes of the next section to form a valid instruction, which can in turn throw off the disassembly of the following instructions at the start of the next section.

What do people think about using a target-specific nop instruction sequence to pad executable sections? Another possible option, on x86_64 at least (I haven't investigated other targets), is to use the 0xcc interrupt instruction.

Regards,

James

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170310/7c18061a/attachment.html>


More information about the llvm-dev mailing list