[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