[PATCH] ld: Pad the previous code segment with NOPs
Alan Modra
amodra@gmail.com
Fri Jan 12 08:44:00 GMT 2018
On Thu, Jan 11, 2018 at 07:25:14PM -0800, H.J. Lu wrote:
> @@ -5429,6 +5431,28 @@ assign_file_positions_for_load_sections (bfd *abfd,
> && (off & -maxpagesize) == ((off + off_adjust) & -maxpagesize))
> off_adjust += maxpagesize;
> off += off_adjust;
> +
> + if (off_adjust != 0
> + && j > 1
> + && p[-1].p_filesz != 0
> + && (p[-1].p_flags & PF_X) != 0)
> + {
> + /* Pad the previous code segment with NOPs. */
> + char *fill = abfd->arch_info->fill (off_adjust,
> + bfd_big_endian (abfd),
> + TRUE);
> + if (fill == NULL
> + || bfd_seek (abfd, off_prev_end, SEEK_SET) != 0
> + || bfd_bwrite (fill, off_adjust, abfd) != off_adjust)
> + {
> + _bfd_error_handler
> + (_("%B: failed to pad code segment %d"), j - 1, abfd);
> + return FALSE;
> + }
> +
> + free (fill);
> + }
> +
Two things strike me as non-ideal here:
1) For targets that have arch_info->fill == bfd_arch_default_fill this
writes zeros to the output file, destroying a chance for the file to
be sparse. ie. This patch may waste disk blocks.
2) The i386 fill function uses multi-byte nops. Are any of those
patterns exploitable when executed at any offset from the start of the
insns? Do other targets have the same potential problem?
--
Alan Modra
Australia Development Lab, IBM
More information about the Binutils
mailing list