[RTEMS Project] #2552: Add per-section compilation and rtems dynamic linking support
RTEMS trac
trac at rtems.org
Wed Nov 9 23:05:21 UTC 2022
#2552: Add per-section compilation and rtems dynamic linking support
--------------------------+--------------------------
Reporter: Serg Kruglov | Owner: Chris Johns
Type: defect | Status: assigned
Priority: normal | Milestone: Indefinite
Component: lib/dl | Version: 7
Severity: normal | Resolution:
Keywords: | Blocked By:
Blocking: |
--------------------------+--------------------------
Changes (by Chris Johns):
* version: 5 => 7
* milestone: 5.2 => Indefinite
Old description:
> If rtems libraries and image build with per-section compilation flags rap
> files (maybe and other) build with duplicate symbols(objects).
> Gnu ld with flag -gc-sections remove unnessary symbols(objects)? but
> rtems-ld this does.
> I wrote small sample with 3 projects:
> a) static lib libtst.a with one file tst.c
> tst.c
>
> int abcd=5;
> void funcA(void)
> {
> abcd=7;
> }
> void funcB(void)
> {
> }
> b) any rtems project (minimal or any) linked with this lib and in Init
> call function from lib
>
> extern void funcA(void);
> extern int abcd;
> rtems_task Init(rtems_task_argument argument) {
> funcA();
> abcd = 9;
> rtems_task_delete(RTEMS_SELF);
> }
> c) rap file project with core image from b) and library from a)
> test.c
>
> extern void funcB(void);
> void rtems(void)
> {
> funcB();
> }
>
> After generate map files with rtems-rap -sSr
>
> Map file without per-section compilation
> testrap.rap:
> Strings: 0x00000074 (116) size: 14
> 0 (0x000000):
> 1 (0x000001): rtems
> 2 (0x000007): rtems
> 3 (0x00000d):
> Symbols: 0x00000082 (130) size: 12
> data section value name
> 0: 0x0012 .text 0x00000000 rtems
> Relocations: 0x0000008e (142)
> .text: info offset addend symbol name
> 0: 0x80000504 0x00000008 0x00000000 funcB
>
> Map file with per-section compilation
> testrap.rap:
> Strings: 0x00000090 (144) size: 31
> 0 (0x000000):
> 1 (0x000001): rtems
> 2 (0x000007): funcA
> 3 (0x00000d): abcd
> 4 (0x000012): funcB
> 5 (0x000018): rtems
> 6 (0x00001e):
> Symbols: 0x000000af (175) size: 48
> data section value name
> 0: 0x0012 .text 0x00000000 rtems
> 1: 0x0012 .text 0x00000000 funcA
> 2: 0x0011 .data 0x00000000 abcd
> 3: 0x0012 .text 0x00000000 funcB
> Relocations: 0x000000df (223)
> .text: info offset addend symbol name
> 0: 0xc0001204 0x00000008 0x00000000
> 1: 0xc0000d05 0x00000024 0x00000000
> 2: 0xc0000d06 0x0000002c 0x00000000
>
> If use per-section compilation while insert funcB (from library libtst.a)
> get full tst.o from library.
> Objects funcA and abcd duplicate already available in kernel.
>
> I do not know as it to correct and remove excess symbols and objects.
New description:
If rtems libraries and image build with per-section compilation flags rap
files (maybe and other) build with duplicate symbols(objects).
Gnu ld with flag -gc-sections remove unnessary symbols(objects)? but
rtems-ld this does.
I wrote small sample with 3 projects:
a) static lib libtst.a with one file tst.c
tst.c
{{{
int abcd=5;
void funcA(void)
{
abcd=7;
}
void funcB(void)
{
}
}}}
b) any rtems project (minimal or any) linked with this lib and in Init
call function from lib
{{{
extern void funcA(void);
extern int abcd;
rtems_task Init(rtems_task_argument argument) {
funcA();
abcd = 9;
rtems_task_delete(RTEMS_SELF);
}
}}}
c) rap file project with core image from b) and library from a)
test.c
{{{
extern void funcB(void);
void rtems(void)
{
funcB();
}
}}}
After generate map files with rtems-rap -sSr
Map file without per-section compilation
testrap.rap:
{{{
Strings: 0x00000074 (116) size: 14
0 (0x000000):
1 (0x000001): rtems
2 (0x000007): rtems
3 (0x00000d):
Symbols: 0x00000082 (130) size: 12
data section value name
0: 0x0012 .text 0x00000000 rtems
Relocations: 0x0000008e (142)
.text: info offset addend symbol name
0: 0x80000504 0x00000008 0x00000000 funcB
}}}
Map file with per-section compilation
testrap.rap:
{{{
Strings: 0x00000090 (144) size: 31
0 (0x000000):
1 (0x000001): rtems
2 (0x000007): funcA
3 (0x00000d): abcd
4 (0x000012): funcB
5 (0x000018): rtems
6 (0x00001e):
Symbols: 0x000000af (175) size: 48
data section value name
0: 0x0012 .text 0x00000000 rtems
1: 0x0012 .text 0x00000000 funcA
2: 0x0011 .data 0x00000000 abcd
3: 0x0012 .text 0x00000000 funcB
Relocations: 0x000000df (223)
.text: info offset addend symbol name
0: 0xc0001204 0x00000008 0x00000000
1: 0xc0000d05 0x00000024 0x00000000
2: 0xc0000d06 0x0000002c 0x00000000
}}}
If use per-section compilation while insert funcB (from library libtst.a)
get full tst.o from library.
Objects funcA and abcd duplicate already available in kernel.
I do not know as it to correct and remove excess symbols and objects.
--
Comment:
Needs funding
--
Ticket URL: <http://devel.rtems.org/ticket/2552#comment:8>
RTEMS Project <http://www.rtems.org/>
RTEMS Project
More information about the bugs
mailing list