Linker sets alignment change
Jeff Kubascik
jeff.kubascik at dornerworks.com
Tue Feb 4 20:02:02 UTC 2020
Hey Sebastian,
On 2/1/2020 9:23 AM, Sebastian Huber wrote:
> Hello Jeff,
>
> ----- Am 14. Jan 2020 um 17:37 schrieb Jeff Kubascik jeff.kubascik at dornerworks.com:
>
>> Hello,
>>
>> I have noticed a change in the linker section ".rtemsrwset" alignment which has
>> affected the zImage header that was added with the arm/xen BSP. The zImage
>> header uses the bsp_section_data_end symbol to determine the end of the image. I
>> was able to track this change to the commit 234d155e linkersets: Revert to
>> zero-length arrays.
>>
>> Here is the readelf output of the ticker.exe application just prior before
>> commit
>>
>> Section Headers:
>> [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
>> [15] .rtemsstack NOBITS 40100000 01358c 001000 00 WA 0 0 64
>> [16] .data PROGBITS 40101000 101000 0004e0 00 WA 0 0 8
>> [17] .rtemsrwset PROGBITS 401014e0 1014e0 000000 00 0 0 1
>>
>> Here is the output with the commit
>>
>> Section Headers:
>> [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
>> [15] .rtemsstack NOBITS 40100000 01358c 001000 00 WA 0 0 64
>> [16] .data PROGBITS 40101000 101000 0004e0 00 WA 0 0 8
>> [17] .rtemsrwset PROGBITS 40101500 101500 000000 00 WA 0 0 64
>>
>> This shows that the alignment of the ".rtemsrwset" section changed from 1 byte
>> to 64 bytes. This changes the start address of the section to be aligned, even
>> though the section is empty.
>>
>> The bsp_section_data_end symbol is located at the end of the ".rtemsrwset"
>> section. If the section is empty, the bsp_section_data_end symbol will contain
>> the start address of the section.
>>
>> .data : ALIGN_WITH_INPUT {
>> bsp_section_data_begin = .;
>> *(.data .data.* .gnu.linkonce.d.*)
>> SORT(CONSTRUCTORS)
>> } > REGION_DATA AT > REGION_DATA_LOAD
>> .data1 : ALIGN_WITH_INPUT {
>> *(.data1)
>> } > REGION_DATA AT > REGION_DATA_LOAD
>> .rtemsrwset : ALIGN_WITH_INPUT {
>> KEEP (*(SORT(.rtemsrwset.*)))
>> bsp_section_data_end = .;
>> } > REGION_DATA AT > REGION_DATA_LOAD
>>
>> When I convert the ticker.exe elf to a binary with objcopy, the binary doesn't
>> include the ".rtemsrwset" section, since it's empty. As a result, the length of
>> the binary doesn't match the bsp_section_data_end symbol. This is a problem for
>> some zImage loaders that verify the image length.
>>
>> I'm not certain what would be the best way to fix the zImage header. Is there a
>> different symbol that I should be using to get the end of the image? Maybe this
>> is a bug with the linker script?
>
> there is no bug in the linker script. In wkspace.c there is this linker set declared:
>
> RTEMS_LINKER_RWSET(
> _Per_CPU_Data,
> RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES ) char
> );
>
> So, the .rtemsrwset contains an empty _Per_CPU_Data set which is properly aligned.
>
> In uniprocessor configuration, the cache alignment is superfluous. I will fix this.
If I understand correctly, the plan is to negate/undo the cache alignment change
that was introduced in commit 234d155e for uni-processor configuration? If that
is correct, it should fix the issue.
> Why don't you use the file size of your binary created by objcopy to set the image size?
>
This would require that I modify the binary/elf contents manually after linking,
as the size field is stored in the zImage header near the start of the application.
For development, I was padding the binary blob up to cache alignment match the
expected size in the zImage header. While this worked, it was clunky and tedious.
Sincerely,
Jeff Kubascik
More information about the devel
mailing list