On 8/7/26 12:42, Michael Tokarev wrote:
Source: gcc-16
Version: 16.1.0-3
Severity: normal
X-Debbugs-Cc: [email protected]
User: [email protected]
Usertags: hppa

Building firmware with hppa and hppa64 gcc, with option
-ffreestanding.  Starting with gcc-16, the following code

     struct tpm_log_entry le = {
         .hdr.pcrindex = pcpes->pcrindex,
         .hdr.eventtype = pcpes->eventtype,
     };

causes the following error to me emitted at link time:

  hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o: in function `hash_log_extend':
  ccode32flat.o.tmp.c:(.text+0x5400): undefined reference to `memset'
  hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o(.text+0x5400): cannot reach memset
  ccode32flat.o.tmp.c:(.text+0x5400): relocation truncated to fit: 
R_PARISC_PCREL22F against undefined symbol `memset'

The struct in question is a bit large, so it really needs
some memory zeroing in this case.  But the compiler is given
-ffreestanding.

Actually it is more interesting.  The firmware does have
memset() definition in there.

The original command line:

 hppa64-linux-gnu-ld -N -T o64/pafirmware.lds o64/head.o o64/version.o -X -o 
o64/hppa-firmware64.img -e startup \
    --as-needed o64/ccode32flat.o /usr/lib/gcc/hppa64-linux-gnu/16/libgcc.a

produces the original error messages:

 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o: in function 
`hash_log_extend':
 ccode32flat.o.tmp.c:(.text+0x5400): undefined reference to `memset'
 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o(.text+0x5400): cannot 
reach memset
 ccode32flat.o.tmp.c:(.text+0x5400): relocation truncated to fit: 
R_PARISC_PCREL22F against undefined symbol `memset'
 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o: in function 
`tpm_add_measurement_to_log':
 ccode32flat.o.tmp.c:(.text+0x7130): undefined reference to `memset'
 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o(.text+0x7130): cannot 
reach memset
 ccode32flat.o.tmp.c:(.text+0x7130): relocation truncated to fit: 
R_PARISC_PCREL22F against undefined symbol `memset'
 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o: in function 
`tpm20_write_EfiSpecIdEventStruct':
 ccode32flat.o.tmp.c:(.text+0x72d8): undefined reference to `memset'
 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o(.text+0x72d8): cannot 
reach memset
 ccode32flat.o.tmp.c:(.text+0x72d8): relocation truncated to fit: 
R_PARISC_PCREL22F against undefined symbol `memset'
 /usr/bin/hppa64-linux-gnu-ld.bfd: ccode32flat.o.tmp.c:(.text+0x73a0): 
undefined reference to `memset'
 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/ccode32flat.o(.text+0x73a0): cannot 
reach memset
 ccode32flat.o.tmp.c:(.text+0x73a0): relocation truncated to fit: 
R_PARISC_PCREL22F against undefined symbol `memset'

all these are about local variable assignments like the
above.  But adding memset() symbol to the command line
fails differently:

 hppa64-linux-gnu-ld -N -T o64/pafirmware.lds o64/head.o o64/version.o -X -o 
o64/hppa-firmware64.img -e startup \
    --as-needed o64/ccode32flat.o o64/src/string.o 
/usr/lib/gcc/hppa64-linux-gnu/16/libgcc.a

(note the added o64/src/string.o here).  Now it complains about multiple
definitions of memset!

 /usr/bin/hppa64-linux-gnu-ld.bfd: o64/src/string.o: in function `memcpy':
 /build/pkg/build/b/hppa-fw/src/string.c:171: multiple definition of `memcpy'; \
  o64/ccode32flat.o:/build/pkg/build/b/hppa-fw/./src/string.c:171: first 
defined here

So the symbol is actually there, but somehow the linker can't find
it if the reference is made by gcc itself.

hmm..

/mjt

Reply via email to