Sometime at or before head -r349444 my historical src.conf variant
that i use to amd64->powerpc cross-build using devel/powerpc64-binutils
stopped working, getting:

--- libc.so.7.full ---
building shared library libc.so.7
/usr/local/powerpc64-unknown-freebsd13.0/bin/ld: bss-plt forced due to 
/usr/obj/powerpcvtsc_clang_altbinutils/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/crtbeginS.o
cc: error: linker command failed with exit code 1 (use -v to see invocation)
*** [libc.so.7.full] Error code 1


(I had not updated the head revision for a long time before
jumping to -349444 . I'll note that the issue does not seem
to be uniquely tied to crtbeginS.o but the
devel/powerpc64-binutils based builds stop teh build before
hitting other examples.)


The code for devel/powerpc64-bintuils has the comment:

          /* Look through the reloc flags left by ppc_elf_check_relocs.
             Use the old style bss plt if a file makes plt calls
             without using the new relocs, and if ld isn't given
             --secure-plt and we never see REL16 relocs.  */

(I'll show code around that later.)


For something like crtbeginS.o system-clang (from head) ends up with
the likes of the following with no use of any R_PPC_REL16* variants:

Relocation section with addend (.rela.text):
r_offset r_info   r_type              st_value st_name + r_addend
0000001c 00000d17 R_PPC_LOCAL24PC     00000000 _GLOBAL_OFFSET_TABLE_ + fffffffc
00000026 0000060e R_PPC_GOT16         00000008 __do_global_dtors_aux.completed 
+ 0
00000036 00000f0e R_PPC_GOT16         00000000 __cxa_finalize + 0
00000042 0000100e R_PPC_GOT16         00000000 __dso_handle + 0
00000048 00000f12 R_PPC_PLTREL24      00000000 __cxa_finalize + 8000
0000004e 0000070e R_PPC_GOT16         00000004 __do_global_dtors_aux.p + 0
00000062 0000070e R_PPC_GOT16         00000004 __do_global_dtors_aux.p + 0
00000086 0000060e R_PPC_GOT16         00000008 __do_global_dtors_aux.completed 
+ 0
000000ec 00000d17 R_PPC_LOCAL24PC     00000000 _GLOBAL_OFFSET_TABLE_ + fffffffc
000000f6 0000040e R_PPC_GOT16         00000000 __JCR_LIST__ + 0
00000106 00000e0e R_PPC_GOT16         00000000 _Jv_RegisterClasses + 0
00000112 0000040e R_PPC_GOT16         00000000 __JCR_LIST__ + 0

Relocation section with addend (.rela.fini):
r_offset r_info   r_type              st_value st_name + r_addend
00000000 00000b0a R_PPC_REL24         00000000 .text + 0

Relocation section with addend (.rela.init):
r_offset r_info   r_type              st_value st_name + r_addend
00000000 00000b0a R_PPC_REL24         00000000 .text + d4

Relocation section with addend (.rela.data):
r_offset r_info   r_type              st_value st_name + r_addend
00000000 00001001 R_PPC_ADDR32        00000000 __dso_handle + 0
00000004 00000c01 R_PPC_ADDR32        00000000 .dtors + 4

It appears that any .o ending up like crtbeginS.o leads to an overall
use of bss-plt instead of secure-lt use (absent an explicit
--secure-plt ). This ends up being tied to ->has_rel16 use.

The code that sets ->has_rel16 = 1 is:

        case R_PPC_REL16:
        case R_PPC_REL16_LO:
        case R_PPC_REL16_HI:
        case R_PPC_REL16_HA:
          ppc_elf_tdata (abfd)->has_rel16 = 1;
          break;

The plt_type = PLT_NEW use when ->plt_type is initially PLT_UNSET
requires ->has_rel16!=0 :

. . .
 if (htab->plt_type == PLT_UNSET)
   {
     struct elf_link_hash_entry *h;
     if (htab->params->plt_style == PLT_OLD)
        htab->plt_type = PLT_OLD;
     else if (info->shared
               && htab->elf.dynamic_sections_created
               && (h = elf_link_hash_lookup (&htab->elf, "_mcount",
                                             FALSE, FALSE, TRUE)) != NULL
               && (h->type == STT_FUNC
                   || h->needs_plt)
               && h->ref_regular
               && !(SYMBOL_CALLS_LOCAL (info, h)
                    || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
                        && h->root.type == bfd_link_hash_undefweak)))
        . . .
     else
        {
          bfd *ibfd;
          enum ppc_elf_plt_type plt_type = htab->params->plt_style;
          /* Look through the reloc flags left by ppc_elf_check_relocs.
             Use the old style bss plt if a file makes plt calls
             without using the new relocs, and if ld isn't given
             --secure-plt and we never see REL16 relocs.  */
          if (plt_type == PLT_UNSET)
            plt_type = PLT_OLD;
          for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
            if (is_ppc_elf (ibfd))
              {
                if (ppc_elf_tdata (ibfd)->has_rel16)
                  plt_type = PLT_NEW;
                else if (ppc_elf_tdata (ibfd)->makes_plt_call)
                  {
                    plt_type = PLT_OLD;
                    htab->old_bfd = ibfd;
                    break;
                  }
              }
          htab->plt_type = plt_type;
        }
   }
 if (htab->plt_type == PLT_OLD && htab->params->plt_style == PLT_NEW)
   {
     if (htab->old_bfd != NULL)
        info->callbacks->einfo (_("%P: bss-plt forced due to %B\n"),
                                htab->old_bfd);
     else
        info->callbacks->einfo (_("%P: bss-plt forced by profiling\n"));
   }
. . .


( ppc_elf_select_plt_layout in .../binutils-2_25_1/bfd/elf32-ppc.c )

For reference: the .meta file for the crtbeginS.o shows
(I split lines for readability):

# Meta data file 
/usr/obj/powerpcvtsc_clang_altbinutils/powerpc.powerpc/usr/src/powerpc.powerpc/gnu/lib/csu/crtbeginS.o.meta
CMD cc \
-target powerpc-unknown-freebsd13.0 \
--sysroot=/usr/obj/powerpcvtsc_clang_altbinutils/powerpc.powerpc/usr/src/powerpc.powerpc/tmp
 \
-B/usr/local/powerpc64-unknown-freebsd13.0/bin/ \
-O2 -pipe  \
-B/usr/local/powerpc64-unknown-freebsd13.0/bin/ \
-DIN_GCC -DHAVE_LD_EH_FRAME_HDR -DDT_CONFIG -D__GLIBC__=3 \
-fno-inline-functions -fno-exceptions  -fno-zero-initialized-in-bss \
-fno-asynchronous-unwind-tables  -fno-omit-frame-pointer \
-I/usr/src/contrib/gcclibs/include -I/usr/src/contrib/gcc/config \
-I/usr/src/contrib/gcc -I.  -I/usr/src/gnu/usr.bin/cc/cc_tools  \
-g -std=gnu89    -Qunused-arguments    \
-g0 -DCRT_BEGIN -DCRTSTUFFS_O -DSHARED -fpic  \
-c -o crtbeginS.o /usr/src/contrib/gcc/crtstuff.c
CWD 
/usr/obj/powerpcvtsc_clang_altbinutils/powerpc.powerpc/usr/src/powerpc.powerpc/gnu/lib/csu

So noting is explicitly indicating to use secure-plt.

Doing some exploration with partial coverage of buildkernel via the
old system binutils (that does not abort for the bss-plt issue)
instead of devel/powerpc64-binutils reports more examples . . .

# grep bss-plt 
~/sys_typescripts/typescript_make_powerpcvtsc_nodebug_clang_bootstrap-amd64-host-2019-06-27:01:44:37
 | sort -u | more
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/crt1.o
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/crtbeginS.o
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(fixdfdi.o)
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(fixsfdi.o)
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(floatdidf.o)
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(floatdisf.o)
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(floatundidf.o)
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(floatundisf.o)
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(moddi3.o)
Using bss-plt due to 
/usr/obj/powerpcvtsc_clang/powerpc.powerpc/usr/src/powerpc.powerpc/tmp/usr/lib/libgcc.a(umoddi3.o)
Using bss-plt due to accf_http.kld
Using bss-plt due to acl_nfs4.kld
Using bss-plt due to acl_posix1e.kld
Using bss-plt due to if_ae.kld
Using bss-plt due to if_age.kld
Using bss-plt due to reloc.o

The coverage of buildkernel is incomplete because of:

--- agp.ko.full ---
ld: agp.kld(.text+0x37a4): R_PPC_PLTREL24 reloc against local symbol
agp.kld: could not read symbols: Bad value
*** [agp.ko.full] Error code 1


===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)

_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
To unsubscribe, send any mail to "[email protected]"

Reply via email to