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