* [PATCH] symbols: explicitly specify source file name for symtab
@ 2026-05-11 10:00 Jan Beulich
2026-05-11 13:41 ` Andrew Cooper
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Jan Beulich @ 2026-05-11 10:00 UTC (permalink / raw)
To: xen-devel@lists.xenproject.org
Cc: Andrew Cooper, Julien Grall, Stefano Stabellini, Anthony PERARD,
Michal Orzel, Roger Pau Monné, Oleksii Kurochko
If there are any local symbols in an object file, GNU ld will create an
STT_FILE symbol derived from the object file name if there is none in the
incoming symbol table. The object file name, however, varies between
linking passes. As a result, symbol name compression can yield different
results if any of those local symbols need retaining (Arm [and RISC-V]
mapping symbols are omitted, for example). If that difference in
compression would yield a difference in the sizes of symbol_names[] or
symbols_token_table[], the compare-symbol-tables sanity check will fail.
Fixes: d37d63d4b548 ("symbols: prefix static symbols with their source file names")
Reported-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
The observed problem was with a stub generated as Arm64 erratum 843419
workaround. Such stubs' symbols (imo wrongly) are associated with the last
input object, rather than the input object they belong to. Also for other
kinds of stubs, afaict. See
https://sourceware.org/bugzilla/show_bug.cgi?id=34140.
As per the above, having a Fixes: tag here is questionable.
--- a/xen/arch/x86/Makefile
+++ b/xen/arch/x86/Makefile
@@ -200,7 +200,8 @@ $(TARGET).efi: $(objtree)/prelink.o $(no
ifeq ($(CONFIG_DEBUG_INFO),y)
$(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug info from $(@F)"
endif
- $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0s.S
+ $(objtree)/tools/symbols $(all_symbols) --source-name=$(@F).S --empty \
+ > $(dot-target).0s.S
$(MAKE) $(build)=$(@D) .$(@F).0s.o
$(foreach base, $(VIRT_BASE) $(ALT_BASE), \
$(LD) $(call EFI_LDFLAGS,$(base)) -T $(obj)/efi.lds $< $(relocs-dummy) \
@@ -210,6 +211,7 @@ endif
> $(dot-target).1r.S
$(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).0 \
| $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
+ --source-name=$(@F).S \
> $(dot-target).1s.S
$(MAKE) $(build)=$(@D) .$(@F).1r.o .$(@F).1s.o
$(foreach base, $(VIRT_BASE) $(ALT_BASE), \
@@ -220,6 +222,7 @@ endif
> $(dot-target).2r.S
$(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).1 \
| $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
+ --source-name=$(@F).S \
> $(dot-target).2s.S
$(MAKE) $(build)=$(@D) .$(@F).2r.o .$(@F).2s.o
$(call compare-symbol-tables, $(dot-target).1r.o, $(dot-target).2r.o)
--- a/xen/tools/symbols.c
+++ b/xen/tools/symbols.c
@@ -66,6 +66,7 @@ int token_profit[0x10000];
unsigned char best_table[256][2];
unsigned char best_table_len[256];
+static const char *srcname = "xen-syms.S";
static void usage(void)
{
@@ -356,6 +357,7 @@ static void write_src(void)
printf("#define ALGN 4\n");
printf("#endif\n");
+ printf("\t.file \"%s\"\n", srcname);
printf("\t.section .rodata, \"a\"\n");
printf("#ifndef SYMBOLS_ORIGIN\n");
@@ -679,6 +681,8 @@ int main(int argc, char **argv)
unsorted = true;
else if (strcmp(argv[i], "--sort-by-name") == 0)
sort_by_name = 1;
+ else if (strncmp(argv[i], "--source-name=", 14) == 0)
+ srcname = argv[i] + 14;
else if (strcmp(argv[i], "--warn-dup") == 0)
warn_dup = true;
else if (strcmp(argv[i], "--error-dup") == 0)
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] symbols: explicitly specify source file name for symtab
2026-05-11 10:00 [PATCH] symbols: explicitly specify source file name for symtab Jan Beulich
@ 2026-05-11 13:41 ` Andrew Cooper
2026-05-11 13:47 ` Jan Beulich
2026-05-11 13:52 ` Oleksii Kurochko
2026-05-12 9:20 ` Roger Pau Monné
2 siblings, 1 reply; 6+ messages in thread
From: Andrew Cooper @ 2026-05-11 13:41 UTC (permalink / raw)
To: Jan Beulich, xen-devel@lists.xenproject.org
Cc: Andrew Cooper, Julien Grall, Stefano Stabellini, Anthony PERARD,
Michal Orzel, Roger Pau Monné, Oleksii Kurochko
On 11/05/2026 11:00 am, Jan Beulich wrote:
> If there are any local symbols in an object file, GNU ld will create an
> STT_FILE symbol derived from the object file name if there is none in the
> incoming symbol table. The object file name, however, varies between
> linking passes. As a result, symbol name compression can yield different
> results if any of those local symbols need retaining (Arm [and RISC-V]
> mapping symbols are omitted, for example). If that difference in
> compression would yield a difference in the sizes of symbol_names[] or
> symbols_token_table[], the compare-symbol-tables sanity check will fail.
>
> Fixes: d37d63d4b548 ("symbols: prefix static symbols with their source file names")
> Reported-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> ---
> The observed problem was with a stub generated as Arm64 erratum 843419
> workaround. Such stubs' symbols (imo wrongly) are associated with the last
> input object, rather than the input object they belong to. Also for other
> kinds of stubs, afaict. See
> https://sourceware.org/bugzilla/show_bug.cgi?id=34140.
>
> As per the above, having a Fixes: tag here is questionable.
>
> --- a/xen/arch/x86/Makefile
> +++ b/xen/arch/x86/Makefile
> @@ -200,7 +200,8 @@ $(TARGET).efi: $(objtree)/prelink.o $(no
> ifeq ($(CONFIG_DEBUG_INFO),y)
> $(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug info from $(@F)"
> endif
> - $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0s.S
> + $(objtree)/tools/symbols $(all_symbols) --source-name=$(@F).S --empty \
> + > $(dot-target).0s.S
> $(MAKE) $(build)=$(@D) .$(@F).0s.o
> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
> $(LD) $(call EFI_LDFLAGS,$(base)) -T $(obj)/efi.lds $< $(relocs-dummy) \
> @@ -210,6 +211,7 @@ endif
> > $(dot-target).1r.S
> $(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).0 \
> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
> + --source-name=$(@F).S \
> > $(dot-target).1s.S
> $(MAKE) $(build)=$(@D) .$(@F).1r.o .$(@F).1s.o
> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
> @@ -220,6 +222,7 @@ endif
> > $(dot-target).2r.S
> $(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).1 \
> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
> + --source-name=$(@F).S \
> > $(dot-target).2s.S
> $(MAKE) $(build)=$(@D) .$(@F).2r.o .$(@F).2s.o
> $(call compare-symbol-tables, $(dot-target).1r.o, $(dot-target).2r.o)
> --- a/xen/tools/symbols.c
> +++ b/xen/tools/symbols.c
> @@ -66,6 +66,7 @@ int token_profit[0x10000];
> unsigned char best_table[256][2];
> unsigned char best_table_len[256];
>
> +static const char *srcname = "xen-syms.S";
>
> static void usage(void)
> {
> @@ -356,6 +357,7 @@ static void write_src(void)
> printf("#define ALGN 4\n");
> printf("#endif\n");
>
> + printf("\t.file \"%s\"\n", srcname);
> printf("\t.section .rodata, \"a\"\n");
>
> printf("#ifndef SYMBOLS_ORIGIN\n");
> @@ -679,6 +681,8 @@ int main(int argc, char **argv)
> unsorted = true;
> else if (strcmp(argv[i], "--sort-by-name") == 0)
> sort_by_name = 1;
> + else if (strncmp(argv[i], "--source-name=", 14) == 0)
> + srcname = argv[i] + 14;
> else if (strcmp(argv[i], "--warn-dup") == 0)
> warn_dup = true;
> else if (strcmp(argv[i], "--error-dup") == 0)
Why does x86 need to plumb the source name in, but the other
architectures don't?
xen-syms.S suffices for both x86 builds AFAICT, so can't it just be
unconditional?
~Andrew
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] symbols: explicitly specify source file name for symtab
2026-05-11 13:41 ` Andrew Cooper
@ 2026-05-11 13:47 ` Jan Beulich
0 siblings, 0 replies; 6+ messages in thread
From: Jan Beulich @ 2026-05-11 13:47 UTC (permalink / raw)
To: Andrew Cooper
Cc: Julien Grall, Stefano Stabellini, Anthony PERARD, Michal Orzel,
Roger Pau Monné, Oleksii Kurochko,
xen-devel@lists.xenproject.org
On 11.05.2026 15:41, Andrew Cooper wrote:
> On 11/05/2026 11:00 am, Jan Beulich wrote:
>> --- a/xen/tools/symbols.c
>> +++ b/xen/tools/symbols.c
>> @@ -66,6 +66,7 @@ int token_profit[0x10000];
>> unsigned char best_table[256][2];
>> unsigned char best_table_len[256];
>>
>> +static const char *srcname = "xen-syms.S";
>>
>> static void usage(void)
>> {
>> @@ -356,6 +357,7 @@ static void write_src(void)
>> printf("#define ALGN 4\n");
>> printf("#endif\n");
>>
>> + printf("\t.file \"%s\"\n", srcname);
>> printf("\t.section .rodata, \"a\"\n");
>>
>> printf("#ifndef SYMBOLS_ORIGIN\n");
>> @@ -679,6 +681,8 @@ int main(int argc, char **argv)
>> unsorted = true;
>> else if (strcmp(argv[i], "--sort-by-name") == 0)
>> sort_by_name = 1;
>> + else if (strncmp(argv[i], "--source-name=", 14) == 0)
>> + srcname = argv[i] + 14;
>> else if (strcmp(argv[i], "--warn-dup") == 0)
>> warn_dup = true;
>> else if (strcmp(argv[i], "--error-dup") == 0)
>
> Why does x86 need to plumb the source name in, but the other
> architectures don't?
>
> xen-syms.S suffices for both x86 builds AFAICT, so can't it just be
> unconditional?
It could. Yet I'd prefer the distinction between xen.efi and xen-syms to
be recognizable (in case any dependent local symbol would show up).
Jan
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] symbols: explicitly specify source file name for symtab
2026-05-11 10:00 [PATCH] symbols: explicitly specify source file name for symtab Jan Beulich
2026-05-11 13:41 ` Andrew Cooper
@ 2026-05-11 13:52 ` Oleksii Kurochko
2026-05-12 9:20 ` Roger Pau Monné
2 siblings, 0 replies; 6+ messages in thread
From: Oleksii Kurochko @ 2026-05-11 13:52 UTC (permalink / raw)
To: Jan Beulich, xen-devel@lists.xenproject.org
Cc: Andrew Cooper, Julien Grall, Stefano Stabellini, Anthony PERARD,
Michal Orzel, Roger Pau Monné
On 5/11/26 12:00 PM, Jan Beulich wrote:
> If there are any local symbols in an object file, GNU ld will create an
> STT_FILE symbol derived from the object file name if there is none in the
> incoming symbol table. The object file name, however, varies between
> linking passes. As a result, symbol name compression can yield different
> results if any of those local symbols need retaining (Arm [and RISC-V]
> mapping symbols are omitted, for example). If that difference in
> compression would yield a difference in the sizes of symbol_names[] or
> symbols_token_table[], the compare-symbol-tables sanity check will fail.
>
> Fixes: d37d63d4b548 ("symbols: prefix static symbols with their source file names")
> Reported-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
I would like to note that with the current staging I can't reproduce
this bug anymore with configs I have:
10d417b8b62e (HEAD -> staging, upstream/staging) xen/arm: skip holes in
physical address space when setting up frametable
2611377cf9c9 xen/riscv: fix MMIO alignment check in imsic_init()
54ca0aadc821 x86/time: make do_settime() uses more accurate
4526d6763466 x86/time: make early NOW() uses slightly more precise
9f976dec039c xen: introduce CONFIG_HAS_DOMAIN_TYPE
bdb30883f352 iommu/amd-vi: do not zero IOMMU MMIO region
4f9457ece11a xsm/flask: Fix undefined behaviour in avc_dump_av()
4ff927133ebc EFI: adjust cfg file buffer freeing
96ffccef5a5f xvmalloc: adjust XVFREE() ordering
e8c1feab33cb CI: Refresh the Debian 12 cppcheck container
278953f6c155 (origin/staging, origin/HEAD) automation/gitlab: introduce
macOS build jobs
But when I switched to origin/HEAD I can reproduce the bug and I applied
the suggested patch on top of it and I don't see this bug anymore with
this fix:
Tested-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Thanks.
~ Oleksii
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] symbols: explicitly specify source file name for symtab
2026-05-11 10:00 [PATCH] symbols: explicitly specify source file name for symtab Jan Beulich
2026-05-11 13:41 ` Andrew Cooper
2026-05-11 13:52 ` Oleksii Kurochko
@ 2026-05-12 9:20 ` Roger Pau Monné
2026-05-12 10:51 ` Jan Beulich
2 siblings, 1 reply; 6+ messages in thread
From: Roger Pau Monné @ 2026-05-12 9:20 UTC (permalink / raw)
To: Jan Beulich
Cc: xen-devel@lists.xenproject.org, Andrew Cooper, Julien Grall,
Stefano Stabellini, Anthony PERARD, Michal Orzel,
Oleksii Kurochko
On Mon, May 11, 2026 at 12:00:03PM +0200, Jan Beulich wrote:
> If there are any local symbols in an object file, GNU ld will create an
> STT_FILE symbol derived from the object file name if there is none in the
> incoming symbol table. The object file name, however, varies between
> linking passes. As a result, symbol name compression can yield different
> results if any of those local symbols need retaining (Arm [and RISC-V]
> mapping symbols are omitted, for example). If that difference in
> compression would yield a difference in the sizes of symbol_names[] or
> symbols_token_table[], the compare-symbol-tables sanity check will fail.
>
> Fixes: d37d63d4b548 ("symbols: prefix static symbols with their source file names")
> Reported-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
> ---
> The observed problem was with a stub generated as Arm64 erratum 843419
> workaround. Such stubs' symbols (imo wrongly) are associated with the last
> input object, rather than the input object they belong to. Also for other
> kinds of stubs, afaict. See
> https://sourceware.org/bugzilla/show_bug.cgi?id=34140.
>
> As per the above, having a Fixes: tag here is questionable.
>
> --- a/xen/arch/x86/Makefile
> +++ b/xen/arch/x86/Makefile
> @@ -200,7 +200,8 @@ $(TARGET).efi: $(objtree)/prelink.o $(no
> ifeq ($(CONFIG_DEBUG_INFO),y)
> $(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug info from $(@F)"
> endif
> - $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0s.S
> + $(objtree)/tools/symbols $(all_symbols) --source-name=$(@F).S --empty \
> + > $(dot-target).0s.S
> $(MAKE) $(build)=$(@D) .$(@F).0s.o
> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
> $(LD) $(call EFI_LDFLAGS,$(base)) -T $(obj)/efi.lds $< $(relocs-dummy) \
> @@ -210,6 +211,7 @@ endif
> > $(dot-target).1r.S
> $(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).0 \
> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
> + --source-name=$(@F).S \
> > $(dot-target).1s.S
> $(MAKE) $(build)=$(@D) .$(@F).1r.o .$(@F).1s.o
> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
> @@ -220,6 +222,7 @@ endif
> > $(dot-target).2r.S
> $(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).1 \
> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
> + --source-name=$(@F).S \
> > $(dot-target).2s.S
Wouldn't it be more accurate to use $(dot-target) as the source name?
Maybe $(notdir $(dot-target)).S?
I see the default is already set to the target filename for other
arches, so not a big deal IMO.
Thanks, Roger.
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] symbols: explicitly specify source file name for symtab
2026-05-12 9:20 ` Roger Pau Monné
@ 2026-05-12 10:51 ` Jan Beulich
0 siblings, 0 replies; 6+ messages in thread
From: Jan Beulich @ 2026-05-12 10:51 UTC (permalink / raw)
To: Roger Pau Monné
Cc: xen-devel@lists.xenproject.org, Andrew Cooper, Julien Grall,
Stefano Stabellini, Anthony PERARD, Michal Orzel,
Oleksii Kurochko
On 12.05.2026 11:20, Roger Pau Monné wrote:
> On Mon, May 11, 2026 at 12:00:03PM +0200, Jan Beulich wrote:
>> If there are any local symbols in an object file, GNU ld will create an
>> STT_FILE symbol derived from the object file name if there is none in the
>> incoming symbol table. The object file name, however, varies between
>> linking passes. As a result, symbol name compression can yield different
>> results if any of those local symbols need retaining (Arm [and RISC-V]
>> mapping symbols are omitted, for example). If that difference in
>> compression would yield a difference in the sizes of symbol_names[] or
>> symbols_token_table[], the compare-symbol-tables sanity check will fail.
>>
>> Fixes: d37d63d4b548 ("symbols: prefix static symbols with their source file names")
>> Reported-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> Acked-by: Roger Pau Monné <roger.pau@citrix.com>
Thanks.
>> --- a/xen/arch/x86/Makefile
>> +++ b/xen/arch/x86/Makefile
>> @@ -200,7 +200,8 @@ $(TARGET).efi: $(objtree)/prelink.o $(no
>> ifeq ($(CONFIG_DEBUG_INFO),y)
>> $(if $(filter --strip-debug,$(EFI_LDFLAGS)),echo,:) "Will strip debug info from $(@F)"
>> endif
>> - $(objtree)/tools/symbols $(all_symbols) --empty > $(dot-target).0s.S
>> + $(objtree)/tools/symbols $(all_symbols) --source-name=$(@F).S --empty \
>> + > $(dot-target).0s.S
>> $(MAKE) $(build)=$(@D) .$(@F).0s.o
>> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
>> $(LD) $(call EFI_LDFLAGS,$(base)) -T $(obj)/efi.lds $< $(relocs-dummy) \
>> @@ -210,6 +211,7 @@ endif
>> > $(dot-target).1r.S
>> $(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).0 \
>> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
>> + --source-name=$(@F).S \
>> > $(dot-target).1s.S
>> $(MAKE) $(build)=$(@D) .$(@F).1r.o .$(@F).1s.o
>> $(foreach base, $(VIRT_BASE) $(ALT_BASE), \
>> @@ -220,6 +222,7 @@ endif
>> > $(dot-target).2r.S
>> $(NM) -pa --format=sysv $(dot-target).$(VIRT_BASE).1 \
>> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
>> + --source-name=$(@F).S \
>> > $(dot-target).2s.S
>
> Wouldn't it be more accurate to use $(dot-target) as the source name?
>
> Maybe $(notdir $(dot-target)).S?
Why would that be better (more accurate)? The file names change, so the
specified file is "virtual" anyway. I simply don't see why prepending a
. would be helpful.
> I see the default is already set to the target filename for other
> arches, so not a big deal IMO.
It's a "virtual" filename also there. No real xen-syms.S is ever created.
Jan
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-05-12 10:51 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-11 10:00 [PATCH] symbols: explicitly specify source file name for symtab Jan Beulich
2026-05-11 13:41 ` Andrew Cooper
2026-05-11 13:47 ` Jan Beulich
2026-05-11 13:52 ` Oleksii Kurochko
2026-05-12 9:20 ` Roger Pau Monné
2026-05-12 10:51 ` Jan Beulich
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.