From: Jan Beulich <jbeulich@suse.com>
To: "Roger Pau Monné" <roger.pau@citrix.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>, Wei Liu <wl@xen.org>,
xen-devel@lists.xenproject.org
Subject: Re: [PATCH RFC] x86/lld: fix symbol map generation
Date: Tue, 3 May 2022 18:06:22 +0200 [thread overview]
Message-ID: <cf5be322-09b0-dfd9-bff2-be162f6f2863@suse.com> (raw)
In-Reply-To: <YnDyluwoiux73pqV@Air-de-Roger>
On 03.05.2022 11:15, Roger Pau Monné wrote:
> On Tue, May 03, 2022 at 10:17:44AM +0200, Jan Beulich wrote:
>> On 02.05.2022 17:20, Roger Pau Monne wrote:
>>> The symbol map generation (and thus the debug info attached to Xen) is
>>> partially broken when using LLVM LD. That's due to LLD converting
>>> almost all symbols from global to local in the last linking step, and
>>
>> I'm puzzled by "almost" - is there a pattern of which ones aren't
>> converted?
>
> This is the list of the ones that aren't converted:
>
> __x86_indirect_thunk_r11
> s3_resume
> start
> __image_base__
> __high_start
> wakeup_stack
> wakeup_stack_start
> handle_exception
> dom_crash_sync_extable
> common_interrupt
> __x86_indirect_thunk_rbx
> __x86_indirect_thunk_rcx
> __x86_indirect_thunk_rax
> __x86_indirect_thunk_rdx
> __x86_indirect_thunk_rbp
> __x86_indirect_thunk_rsi
> __x86_indirect_thunk_rdi
> __x86_indirect_thunk_r8
> __x86_indirect_thunk_r9
> __x86_indirect_thunk_r10
> __x86_indirect_thunk_r12
> __x86_indirect_thunk_r13
> __x86_indirect_thunk_r14
> __x86_indirect_thunk_r15
>
> I assume there's some kind of pattern, but I haven't yet been able to
> spot where triggers the conversion from global to local in lld.
At least this looks to all be symbols defined in assembly files, which
don't have a C-visible declaration.
>>> Not applied to EFI, partially because I don't have an environment with
>>> LLD capable of generating the EFI binary.
>>>
>>> Obtaining the global symbol list could likely be a target on itself,
>>> if it is to be shared between the ELF and the EFI binary generation.
>>
>> If, as the last paragraph of the description is worded, you did this
>> just once (as a prereq), I could see this working.
>
> Yes, my comment was about splitting the:
>
> $(NM) -pa --format=bsd $< | awk '{ if($$2 == "T") print $$3}' \
> > $(@D)/.$(@F).global-syms
>
> rune into a separate $(TARGET)-syms.global-syms target or some such.
> Not sure it's really worth it.
Probably indeed only when splitting up the rule as a whole.
>>> --- a/xen/arch/x86/Makefile
>>> +++ b/xen/arch/x86/Makefile
>>> @@ -134,24 +134,34 @@ $(TARGET): $(TARGET)-syms $(efi-y) $(obj)/boot/mkelf32
>>> CFLAGS-$(XEN_BUILD_EFI) += -DXEN_BUILD_EFI
>>>
>>> $(TARGET)-syms: $(objtree)/prelink.o $(obj)/xen.lds
>>> + # Dump global text symbols before the linking step
>>> + $(NM) -pa --format=bsd $< | awk '{ if($$2 == "T") print $$3}' \
>>> + > $(@D)/.$(@F).global-syms
>>> $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds -N $< $(build_id_linker) \
>>> - $(objtree)/common/symbols-dummy.o -o $(@D)/.$(@F).0
>>> + $(objtree)/common/symbols-dummy.o -o $(@D)/.$(@F).0.tmp
>>> + # LLVM LD has converted global symbols into local ones as part of the
>>> + # linking step, convert those back to global before using tools/symbols.
>>> + $(OBJCOPY) --globalize-symbols=$(@D)/.$(@F).global-syms \
>>> + $(@D)/.$(@F).0.tmp $(@D)/.$(@F).0
>>> $(NM) -pa --format=sysv $(@D)/.$(@F).0 \
>>> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort \
>>> >$(@D)/.$(@F).0.S
>>> $(MAKE) $(build)=$(@D) $(@D)/.$(@F).0.o
>>> $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds -N $< $(build_id_linker) \
>>> - $(@D)/.$(@F).0.o -o $(@D)/.$(@F).1
>>> + $(@D)/.$(@F).0.o -o $(@D)/.$(@F).1.tmp
>>> + $(OBJCOPY) --globalize-symbols=$(@D)/.$(@F).global-syms \
>>> + $(@D)/.$(@F).1.tmp $(@D)/.$(@F).1
>>> $(NM) -pa --format=sysv $(@D)/.$(@F).1 \
>>> | $(objtree)/tools/symbols $(all_symbols) --sysv --sort $(syms-warn-dup-y) \
>>> >$(@D)/.$(@F).1.S
>>> $(MAKE) $(build)=$(@D) $(@D)/.$(@F).1.o
>>> $(LD) $(XEN_LDFLAGS) -T $(obj)/xen.lds -N $< $(build_id_linker) \
>>> - $(orphan-handling-y) $(@D)/.$(@F).1.o -o $@
>>> + $(orphan-handling-y) $(@D)/.$(@F).1.o -o $@.tmp
>>> + $(OBJCOPY) --globalize-symbols=$(@D)/.$(@F).global-syms $@.tmp $@
>>
>> Is this very useful? It only affects ...
>>
>>> $(NM) -pa --format=sysv $(@D)/$(@F) \
>>> | $(objtree)/tools/symbols --all-symbols --xensyms --sysv --sort \
>>> >$(@D)/$(@F).map
>>
>> ... the actual map file; what's in the binary and in this map file doesn't
>> depend on local vs global anymore (and you limit this to text symbols
>> anyway; I wonder in how far livepatching might also be affected by the
>> same issue with data symbols).
>
> If I don't add this step then the map file will also end up with lines
> like:
>
> 0xffff82d0405b6968 b lib/xxhash64.c#iommuv2_enabled
> 0xffff82d0405b6970 b lib/xxhash64.c#nr_ioapic_sbdf
> 0xffff82d0405b6980 b lib/xxhash64.c#ioapic_sbdf
>
> I see the same happen with other non-text symbols, so I would likely
> need to extend the fixing to preserve all global symbols from the
> input file, not just text ones.
Oh, I see - yes, this wants avoiding.
Jan
next prev parent reply other threads:[~2022-05-03 16:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-02 15:20 [PATCH RFC] x86/lld: fix symbol map generation Roger Pau Monne
2022-05-03 8:17 ` Jan Beulich
2022-05-03 9:15 ` Roger Pau Monné
2022-05-03 16:06 ` Jan Beulich [this message]
2022-05-05 8:39 ` Roger Pau Monné
2022-05-05 11:44 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cf5be322-09b0-dfd9-bff2-be162f6f2863@suse.com \
--to=jbeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=roger.pau@citrix.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.