+2018-12-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/23930
+       * elfxx-x86.c (_bfd_x86_elf_size_dynamic_sections): Update
+       the iplt section alignment if it is non-empty.
+       (_bfd_x86_elf_link_setup_gnu_properties): Set plt.iplt_alignment
+       and delay setting the iplt section alignment.
+       * elfxx-x86.h (elf_x86_plt_layout): Add iplt_alignment.
+
 2018-11-30  Nick Clifton  <nickc@redhat.com>
 
        PR 23942
 
       if ((s->flags & SEC_HAS_CONTENTS) == 0)
        continue;
 
+      /* NB: Initially, the iplt section has minimal alignment to
+        avoid moving dot of the following section backwards when
+        it is empty.  Update its section alignment now since it
+        is non-empty.  */
+      if (s == htab->elf.iplt)
+       bfd_set_section_alignment (s->owner, s,
+                                  htab->plt.iplt_alignment);
+
       /* Allocate memory for the section contents.  We use bfd_zalloc
         here in case unused entries are not reclaimed before the
         section's contents are written out.  This should not happen,
        }
     }
 
-  if (normal_target)
+  /* The .iplt section is used for IFUNC symbols in static
+     executables.  */
+  sec = htab->elf.iplt;
+  if (sec != NULL)
     {
-      /* The .iplt section is used for IFUNC symbols in static
-        executables.  */
-      sec = htab->elf.iplt;
-      if (sec != NULL
-         && !bfd_set_section_alignment (sec->owner, sec,
-                                        plt_alignment))
+      /* NB: Delay setting its alignment until we know it is non-empty.
+        Otherwise an empty iplt section may change vma and lma of the
+        following sections, which triggers moving dot of the following
+        section backwards, resulting in a warning and section lma not
+        being set properly.  It later leads to a "File truncated"
+        error.  */
+      if (!bfd_set_section_alignment (sec->owner, sec, 0))
        goto error_alignment;
+
+      htab->plt.iplt_alignment = (normal_target
+                                 ? plt_alignment
+                                 : bed->plt_alignment);
     }
 
   return pbfd;
 
      This is only used for x86-64.  */
   unsigned int plt_got_insn_size;
 
+  /* Alignment of the .iplt section.  */
+  unsigned int iplt_alignment;
+
   /* .eh_frame covering the .plt section.  */
   const bfd_byte *eh_frame_plt;
   unsigned int eh_frame_plt_size;
 
+2018-12-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/23930
+       * testsuite/ld-i386/i386.exp: Run pr23930.
+       * testsuite/ld-i386/pr23930.d: New file.
+       * testsuite/ld-x86-64/pr23930-32.t: Likewise.
+       * testsuite/ld-x86-64/pr23930-x32.d: Likewise.
+       * testsuite/ld-x86-64/pr23930.d: Likewise.
+       * testsuite/ld-x86-64/pr23930.t: Likewise.
+       * testsuite/ld-x86-64/pr23930a.s: Likewise.
+       * testsuite/ld-x86-64/pr23930b.s: Likewise.
+       * testsuite/ld-x86-64/x86-64.exp: Run pr23930 and pr23930-x32.
+---
 2018-11-30  Alan Modra  <amodra@gmail.com>
 
        * testsuite/ld-powerpc/pr23937.d,
 
 run_dump_test "pr23486c"
 run_dump_test "pr23486d"
 run_dump_test "pr23854"
+run_dump_test "pr23930"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "i?86-*-gnu*"]
 
--- /dev/null
+#source: ../ld-x86-64/pr23930a.s
+#source: ../ld-x86-64/pr23930b.s
+#as: --32
+#ld: -m elf_i386 -z separate-code -z norelro -T ../ld-x86-64/pr23930-32.t
+#objdump: --disassemble=main
+
+#...
+[a-f0-9]+ <main>:
+[a-f0-9]+:     31 c0                   xor    %eax,%eax
+[a-f0-9]+:     c3                      ret    
+#pass
 
--- /dev/null
+PHDRS {
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ . = (0x8000000f + ALIGN(0x1000000, 0x1000000));
+ .text : AT(ADDR(.text) - 0x8000000f) {
+ } :text
+}
 
--- /dev/null
+#source: pr23930a.s
+#source: pr23930b.s
+#as: --x32
+#ld: -m elf32_x86_64 -z separate-code -z norelro -T pr23930-32.t
+#objdump: --disassemble=main
+
+#...
+[a-f0-9]+ <main>:
+[a-f0-9]+:     31 c0                   xor    %eax,%eax
+[a-f0-9]+:     c3                      retq   
+#pass
 
--- /dev/null
+#source: pr23930a.s
+#source: pr23930b.s
+#as: --64
+#ld: -m elf_x86_64 -z separate-code -z norelro -T pr23930.t
+#objdump: --disassemble=main
+
+#...
+[a-f0-9]+ <main>:
+[a-f0-9]+:     31 c0                   xor    %eax,%eax
+[a-f0-9]+:     c3                      retq   
+#pass
 
--- /dev/null
+PHDRS {
+ text PT_LOAD;
+}
+
+SECTIONS
+{
+ . = (0xffffffff8000000f + ALIGN(0x1000000, 0x1000000));
+ .text : AT(ADDR(.text) - 0xffffffff8000000f) {
+ } :text
+}
 
--- /dev/null
+       .text
+       .globl  other
+       .type   other, @function
+other:
+       xorl    %eax, %eax
+       ret
+       .size   other, .-other
 
--- /dev/null
+       .text
+       .globl  orig
+       .type   orig, @function
+orig:
+       xorl    %eax, %eax
+       ret
+       .size   orig, .-orig
+       .section        .text.startup,"ax",@progbits
+       .globl  main
+       .type   main, @function
+main:
+       xorl    %eax, %eax
+       ret
+       .size   main, .-main
 
 run_dump_test "pr23486d"
 run_dump_test "pr23486d-x32"
 run_dump_test "pr23854"
+run_dump_test "pr23930"
+run_dump_test "pr23930-x32"
 
 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return