|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 1/4] plat: prepare linker script for thread-local storage
Hi Florian,
On 4/24/19 9:42 AM, Florian Schmidt wrote:
> Hi Costin,
>
> On 4/16/19 3:20 PM, Costin Lupu wrote:
>> Hi Florian,
>>
>> Thanks for this series. As expected, I have some comments.
>>
>> I noticed that the changes for the linker scripts are the same for all
>> platforms and architectures. Now, I believe it would be better to use a
>> single linker script which would contain the required directives and
>> then this script would be included by the platform scripts. It's just
>> the same approach start by the 'plat: Add the eh_frame and eh_frame_hdr
>> sections' patch. You can:
>>
>> 1) follow the approach in 'plat/*: Introduce unikraft internal
>> constructors', meaning that you would extend the
>> 'plat/common/x86/link64.lds' script, or
>>
>> 2) (and this is my preferred solution) introduce a new script, say
>> tls.lds, which would be included by all other scripts.
>
> That is a good point. I forgot that we have a common linker script. I
> have to think about this a bit more, but my first feeling is that this
> code could go there instead of providing yet another linker script that
> needs to be included. An important consideration here is probably the
> linuxu target, which always works slightly differently from the others.
> For example, we do not provide a replacement for the default linker
> script for linuxu.
>
> I'm now wondering: plat/common/x86/link64.lds at the moment only
> contains the exception header sections. Is there a specific reason these
> are necessary for xen and kvm, but not for linuxu?
> How does the exception code work with linuxu, if it's missing the
> symbols for __eh_frame_start and friends? Is the whole point for these
> symbols to be used in the memory regions function (which is only used in
> xen and kvm), and the default linker script provides exception header
> sections that are sufficient for linuxu without including the additional
> linker script?
>
> My current feeling is: if this is a bug, and the linuxu platform should
> indeed include plat/common/x86/link64.lds, then I would add the tls
> stuff there. Otherwise, we could think about an additional linker
> script. However, in that case I would consider renaming the
> generic-sounding plat/common/x86/link64.lds to something a bit more
> expressive that conveys it's really only for eh_frame, and embracing the
> concept of "mix-in" linker scripts fully.
>
AFAIK, there were some issues for linuxu and the decision was to
postpone pushing the changes until the issues would be fixed. Vlad and
Felipe might have more details about that.
>>
>> On 4/15/19 1:03 PM, Florian Schmidt wrote:
>>> Aggregate all .tdata and .tbss variables in the correct sections, and
>>> define global variables that point at section beginning and end.
>>>
>>> Signed-off-by: Florian Schmidt <florian.schmidt@xxxxxxxxx>
>>> ---
>>> plat/common/include/sections.h | 5 +++++
>>> plat/kvm/x86/link64.lds | 18 ++++++++++++++++++
>>> plat/linuxu/Linker.uk | 1 +
>>> plat/linuxu/link.ld | 22 ++++++++++++++++++++++
>>> plat/xen/x86/link64.lds | 18 ++++++++++++++++++
>>> 5 files changed, 64 insertions(+)
>>> create mode 100644 plat/linuxu/link.ld
>>>
>>> diff --git a/plat/common/include/sections.h
>>> b/plat/common/include/sections.h
>>> index 1052cfc7..a2677ce8 100644
>>> --- a/plat/common/include/sections.h
>>> +++ b/plat/common/include/sections.h
>>> @@ -63,6 +63,11 @@ extern char _data[], _edata[];
>>> /* [_ctors, _ectors]: contains constructor tables (read-only) */
>>> extern char _ctors[], _ectors[];
>>> +/* [_tls_start, _tls_end]: contains .tdata.* and .tbss.* sections */
>>> +extern char _tls_start[], _tls_end[];
>>> +/* _etdata: denotes end of .tdata (and start of .tbss */
>>> +extern char _etdata[];
>>> +
>>> /* __bss_start: start of BSS sections */
>>> extern char __bss_start[];
>>> diff --git a/plat/kvm/x86/link64.lds b/plat/kvm/x86/link64.lds
>>> index c96f7501..4e52da49 100644
>>> --- a/plat/kvm/x86/link64.lds
>>> +++ b/plat/kvm/x86/link64.lds
>>> @@ -71,6 +71,24 @@ SECTIONS
>>> }
>>> _ectors = .;
>>> + . = ALIGN(0x8);
>>> + _tls_start = .;
>>> + .tdata :
>>> + {
>>> + *(.tdata)
>>> + *(.tdata.*)
>>> + *(.gnu.linkonce.td.*)
>>> + }
>>> + _etdata = .;
>>> + .tbss :
>>> + {
>>> + *(.tbss)
>>> + *(.tbss.*)
>>> + *(.gnu.linkonce.tb.*)
>>> + . = ALIGN(0x8);
>>> + }
>>> + _tls_end = . + SIZEOF(.tbss);
>>
>> This is something I don't understand. _tls_end is already at the end of
>> .tbss. So why is SIZEOF(.tbss) added? Doesn't this mean that .tbss would
>> be twice the size?
>> Is this expected? If so, would you mind adding a comment in the commit
>> message clearifying this?
>>
>>> +
>>> /* Read-write data (initialized) */
>>> . = ALIGN(0x1000);
>>> _data = .;
>>> diff --git a/plat/linuxu/Linker.uk b/plat/linuxu/Linker.uk
>>> index ef4b201c..e0cd1743 100644
>>> --- a/plat/linuxu/Linker.uk
>>> +++ b/plat/linuxu/Linker.uk
>>> @@ -1,4 +1,5 @@
>>> LINUXU_LDFLAGS-y += -Wl,-e,_liblinuxuplat_start
>>> +EXTRA_LD_SCRIPT-y += $(CONFIG_UK_BASE)/plat/linuxu/link.ld
>>> ##
>>> ## Link image
>>> diff --git a/plat/linuxu/link.ld b/plat/linuxu/link.ld
>>> new file mode 100644
>>> index 00000000..3f5cd682
>>> --- /dev/null
>>> +++ b/plat/linuxu/link.ld
>>> @@ -0,0 +1,22 @@
>>> +SECTIONS
>>> +{
>>> + . = ALIGN(0x8);
>>> + _tls_start = .;
>>> + .tdata :
>>> + {
>>> + *(.tdata)
>>> + *(.tdata.*)
>>> + *(.gnu.linkonce.td.*)
>>> + }
>>> + _etdata = .;
>>> + .tbss :
>>> + {
>>> + *(.tbss)
>>> + *(.tbss.*)
>>> + *(.gnu.linkonce.tb.*)
>>> + . = ALIGN(0x8);
>>> + }
>>> + _tls_end = . + SIZEOF(.tbss);
>>> +}
>>> +
>>> +INSERT BEFORE .data
>>> diff --git a/plat/xen/x86/link64.lds b/plat/xen/x86/link64.lds
>>> index 82ab653a..c8af67c0 100644
>>> --- a/plat/xen/x86/link64.lds
>>> +++ b/plat/xen/x86/link64.lds
>>> @@ -67,6 +67,24 @@ SECTIONS
>>> . = ALIGN(4096);
>>> _ectors = .;
>>> + . = ALIGN(0x8);
>>> + _tls_start = .;
>>> + .tdata :
>>> + {
>>> + *(.tdata)
>>> + *(.tdata.*)
>>> + *(.gnu.linkonce.td.*)
>>> + }
>>> + _etdata = .;
>>> + .tbss :
>>> + {
>>> + *(.tbss)
>>> + *(.tbss.*)
>>> + *(.gnu.linkonce.tb.*)
>>> + . = ALIGN(0x8);
>>> + }
>>> + _tls_end = . + SIZEOF(.tbss);
>>> +
>>> /* Data */
>>> _data = .;
>>> .data : {
>>>
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |