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.kubas...@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
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to