From: Chris Johns <chr...@rtems.org> Updates #3687 --- .../gen5200/start/linkcmds.gen5200_base | 19 +++++- bsps/powerpc/haleakala/start/linkcmds | 12 ++++ bsps/powerpc/mpc8260ads/start/linkcmds | 24 ++++--- bsps/powerpc/shared/start/linkcmds.share | 24 ++++++- bsps/powerpc/ss555/start/linkcmds | 68 +++++++++++-------- bsps/powerpc/virtex4/start/linkcmds | 12 +++- bsps/powerpc/virtex5/start/linkcmds | 12 +++- cpukit/libdl/rtl-mdreloc-powerpc.c | 15 ++++ 8 files changed, 144 insertions(+), 42 deletions(-)
diff --git a/bsps/powerpc/gen5200/start/linkcmds.gen5200_base b/bsps/powerpc/gen5200/start/linkcmds.gen5200_base index 5ab30882ce..ca9d50ebb5 100644 --- a/bsps/powerpc/gen5200/start/linkcmds.gen5200_base +++ b/bsps/powerpc/gen5200/start/linkcmds.gen5200_base @@ -27,6 +27,15 @@ RamBase = bsp_ram_start; RamSize = bsp_ram_size; HeapSize = DEFINED(HeapSize) ? HeapSize : 0x0; +/* + * The upper layer linker command file may optionally define the symbol + * bsp_section_small_data_area_size. By default, the small data area is + * defined by the .sdata and .sbss input sections. Define + * bsp_section_small_data_area_size, if you want to make space available for + * dynamically loaded libraries (libdl). Small memory targets which do not use + * libdl, should not define this symbol. + */ + MEMORY { UNEXPECTED_SECTIONS : ORIGIN = 0xffffffff, LENGTH = 0 } @@ -233,6 +242,7 @@ SECTIONS { } > RAM .sdata : { + bsp_section_sdata_begin = .; PROVIDE (_SDA_BASE_ = 32768); *(.sdata .sdata.* .gnu.linkonce.s.*) @@ -245,13 +255,14 @@ SECTIONS { * BSP: End of data section */ bsp_section_data_end = .; + bsp_section_sdata_end = .; } > RAM .sbss : { /* * BSP: Start of bss section */ - bsp_section_bss_start = .; + bsp_section_sbss_begin = .; __bss_start = .; @@ -260,11 +271,17 @@ SECTIONS { *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .); + bsp_section_sbss_end = .; + bsp_section_sdata_libdl_begin = .; + . = DEFINED(bsp_section_small_data_area_size) ? + bsp_section_sdata_begin + bsp_section_small_data_area_size : .; + bsp_section_sdata_libdl_end = .; . = ALIGN (bsp_section_align); } > RAM .bss : { + bsp_section_bss_start = .; *(COMMON) *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) diff --git a/bsps/powerpc/haleakala/start/linkcmds b/bsps/powerpc/haleakala/start/linkcmds index 7cd993c0c9..dad3e5cc76 100644 --- a/bsps/powerpc/haleakala/start/linkcmds +++ b/bsps/powerpc/haleakala/start/linkcmds @@ -24,6 +24,10 @@ MEMORY { /*FLASH : ORIGIN = 0xFFE00000, LENGTH = 16M*/ } +/* + * Max sdata/bss. + */ +bsp_section_small_data_area_size = 65536; SECTIONS { @@ -217,19 +221,27 @@ SECTIONS .sdata : { . = ALIGN (4); PROVIDE (__SDATA_START__ = .); + bsp_section_sdata_begin = .; sdata.start = .; *(.sdata*) *(.gnu.linkonce.s.*) sdata.end = .; + bsp_section_sdata_end = .; } > RAM /* Zeroed small data addressed as offsets from r13 */ .sbss : { . = ALIGN (4); PROVIDE(__SBSS_START__ = .); + bsp_section_sbss_begin = .; sbss.start = .; *(.sbss .sbss.* *.gnu.linkonce.sb.*); sbss.end = .; + bsp_section_sbss_end = .; + bsp_section_sdata_libdl_begin = .; + . = DEFINED(bsp_section_small_data_area_size) ? + bsp_section_sdata_begin + bsp_section_small_data_area_size : .; + bsp_section_sdata_libdl_end = .; } > RAM PROVIDE(__SBSS_END__ = .); diff --git a/bsps/powerpc/mpc8260ads/start/linkcmds b/bsps/powerpc/mpc8260ads/start/linkcmds index 84933b48e9..82550d41a8 100644 --- a/bsps/powerpc/mpc8260ads/start/linkcmds +++ b/bsps/powerpc/mpc8260ads/start/linkcmds @@ -100,7 +100,7 @@ SECTIONS * end terminate with a NULL entry. */ - PROVIDE (__CTOR_LIST__ = .); + PROVIDE (__CTOR_LIST__ = .); /* LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) */ *crtbegin.o(.ctors) *(.ctors) @@ -227,28 +227,36 @@ SECTIONS .fixup : { *(.fixup) } >ram PROVIDE (_FIXUP_END_ = .); PROVIDE (__FIXUP_END__ = .); - + .sdata : { + bsp_section_sdata_begin = .; PROVIDE (_SDA_BASE_ = 32768); *(.sdata .sdata.* .gnu.linkonce.s.*) - } > ram - + bsp_section_sdata_end = .; + } > ram + .sbss : { __bss_start = .; - + bsp_section_sbss_begin = .; + PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .); *(.scommon) *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .); + bsp_section_sbss_end = .; + bsp_section_sdata_libdl_begin = .; + . = DEFINED(bsp_section_small_data_area_size) ? + bsp_section_sdata_begin + bsp_section_small_data_area_size : .; + bsp_section_sdata_libdl_end = .; } > ram - + .sdata2 : { PROVIDE (_SDA2_BASE_ = 32768); - + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) } > ram =0 - + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } > ram =0 diff --git a/bsps/powerpc/shared/start/linkcmds.share b/bsps/powerpc/shared/start/linkcmds.share index 25655236a7..7bf7279a02 100644 --- a/bsps/powerpc/shared/start/linkcmds.share +++ b/bsps/powerpc/shared/start/linkcmds.share @@ -1,12 +1,23 @@ OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc") OUTPUT_ARCH(powerpc) + /* Do we need any of these for elf? __DYNAMIC = 0; */ MEMORY { VECTORS : ORIGIN = 0x0 , LENGTH = 0x3000 CODE : ORIGIN = 0x3000 , LENGTH = 32M - 0x3000 } + +/* + * The upper layer linker command file may optionally define the symbol + * bsp_section_small_data_area_size. By default, the small data area is + * defined by the .sdata and .sbss input sections. Define + * bsp_section_small_data_area_size, if you want to make space available for + * dynamically loaded libraries (libdl). Small memory targets which do not use + * libdl, should not define this symbol. + */ + SECTIONS { .entry_point_section : @@ -215,11 +226,17 @@ SECTIONS /* We want the small data sections together, so single-instruction offsets can access them all, and initialized data all before uninitialized, so we can shorten the on-disk segment size. */ - .sdata : { PROVIDE (_SDA_BASE_ = 32768); *(.sdata*) *(.gnu.linkonce.s.*) } >CODE + .sdata : { + bsp_section_sdata_begin = .; + PROVIDE (_SDA_BASE_ = 32768); + *(.sdata*) *(.gnu.linkonce.s.*) + bsp_section_sdata_end = .; + } > CODE _edata = .; PROVIDE (edata = .); .sbss : { + bsp_section_sbss_begin = .; PROVIDE (__sbss_start = .); *(.dynsbss) *(.sbss* .gnu.linkonce.sb.*) @@ -230,6 +247,11 @@ SECTIONS . += 1; PROVIDE (__SBSS_END__ = .); PROVIDE (__sbss_end = .); + bsp_section_sbss_end = .; + bsp_section_sdata_libdl_begin = .; + . = DEFINED(bsp_section_small_data_area_size) ? + bsp_section_sdata_begin + bsp_section_small_data_area_size : .; + bsp_section_sdata_libdl_end = .; } > CODE .plt : { *(.plt) } > CODE .bss : diff --git a/bsps/powerpc/ss555/start/linkcmds b/bsps/powerpc/ss555/start/linkcmds index e8df31e2f0..04c9556397 100644 --- a/bsps/powerpc/ss555/start/linkcmds +++ b/bsps/powerpc/ss555/start/linkcmds @@ -15,7 +15,7 @@ */ OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc", "elf32-powerpc") -OUTPUT_ARCH(powerpc) +OUTPUT_ARCH(powerpc) STARTUP(start.o) ENTRY(start) EXTERN(_vectors) @@ -35,14 +35,14 @@ SECTIONS /* * For the MPC555, we use the compressed vector table format which puts * all of the exception vectors before 0x100. - */ + */ *(.vectors) } .text 0x100: { /* Read-only sections, merged into text segment: */ - + text.start = .; /* Entry point is the .entry section */ @@ -54,7 +54,7 @@ SECTIONS /* C++ constructors/destructors */ *(.gnu.linkonce.t*) - + /* Initialization and finalization code. * * Various files can provide initialization and finalization functions. @@ -65,32 +65,32 @@ SECTIONS * doesn't matter if the user does not actually link against ecrti.o and * ecrtn.o; the linker won't look for a file to match a wildcard. The * wildcard also means that it doesn't matter which directory ecrti.o - * and ecrtn.o are in. + * and ecrtn.o are in. */ PROVIDE (_init = .); *ecrti.o(.init) *(.init) *ecrtn.o(.init) - + PROVIDE (_fini = .); *ecrti.o(.fini) *(.fini) *ecrtn.o(.init) - /* + /* * C++ constructors and destructors for static objects. * PowerPC EABI does not use crtstuff yet, so we build "old-style" * constructor and destructor lists that begin with the list length * end terminate with a NULL entry. */ - PROVIDE (__CTOR_LIST__ = .); + PROVIDE (__CTOR_LIST__ = .); /* LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) */ *crtbegin.o(.ctors) *(.ctors) *crtend.o(.ctors) LONG(0) PROVIDE (__CTOR_END__ = .); - + PROVIDE (__DTOR_LIST__ = .); /* LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) */ *crtbegin.o(.dtors) @@ -98,7 +98,7 @@ SECTIONS *crtend.o(.dtors) LONG(0) PROVIDE (__DTOR_END__ = .); - + /* * Special FreeBSD sysctl sections. */ @@ -139,8 +139,8 @@ SECTIONS *(.tdata .tdata.* .gnu.linkonce.td.*) _TLS_Data_end = .; - /* - * .data section contents, copied to RAM at system startup. + /* + * .data section contents, copied to RAM at system startup. */ . = ALIGN(0x20); data.contents.start = .; @@ -163,37 +163,37 @@ SECTIONS * internal RAM. */ . = DEFINED(RTEMS_DEBUG) ? . : int_ram_org; - + .data : AT (data.contents.start) { data.start = .; - + *(.data) *(.data.*) KEEP (*(SORT(.rtemsrwset.*))) *(.data1) - + PROVIDE (__SDATA_START__ = .); *(.sdata .sdata.* .gnu.linkonce.s.*) PROVIDE (__SDATA_END__ = .); - + PROVIDE (__EXCEPT_START__ = .); *(.gcc_except_table*) PROVIDE (__EXCEPT_END__ = .); - + PROVIDE(__GOT_START__ = .); - *(.got.plt) + *(.got.plt) *(.got) PROVIDE(__GOT_END__ = .); - + *(.got1) - + PROVIDE (__GOT2_START__ = .); PROVIDE (_GOT2_START_ = .); *(.got2) PROVIDE (__GOT2_END__ = .); PROVIDE (_GOT2_END_ = .); - + PROVIDE (__FIXUP_START__ = .); PROVIDE (_FIXUP_START_ = .); *(.fixup) @@ -204,9 +204,11 @@ SECTIONS * offsets can access them all. */ PROVIDE (__SDATA2_START__ = .); + bsp_section_sdata_begin = .; *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) PROVIDE (__SDATA2_END__ = .); + bsp_section_sdata_end = .; data.end = .; } @@ -216,14 +218,20 @@ SECTIONS .sbss : { PROVIDE (__sbss_start = .); PROVIDE (___sbss_start = .); + bsp_section_sbss_begin = .; *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) *(.scommon) PROVIDE (__sbss_end = .); PROVIDE (___sbss_end = .); + bsp_section_sbss_end = .; + bsp_section_sdata_libdl_begin = .; + . = DEFINED(bsp_section_small_data_area_size) ? + bsp_section_sdata_begin + bsp_section_small_data_area_size : .; + bsp_section_sdata_libdl_end = .; } .bss : { - *(.dynbss) + *(.dynbss) *(.bss .bss* .gnu.linkonce.b*) *(COMMON) . = ALIGN(4); @@ -247,9 +255,9 @@ SECTIONS . = DEFINED(RTEMS_DEBUG) ? 0 + ext_ram_size : int_ram_top + ext_ram_size; WorkAreaBase = .; - - /* - * Internal I/O devices + + /* + * Internal I/O devices */ .usiu 0x002FC000: /* unified system interface unit */ { @@ -283,22 +291,22 @@ SECTIONS .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } - + /* DWARF debug sections. Symbols in the DWARF debugging sections are relative to the beginning of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } - + /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } - + /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } - + /* DWARF 2 */ .debug_info 0 : { *(.debug_info) } .debug_abbrev 0 : { *(.debug_abbrev) } @@ -307,7 +315,7 @@ SECTIONS .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } - + /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } diff --git a/bsps/powerpc/virtex4/start/linkcmds b/bsps/powerpc/virtex4/start/linkcmds index 46e5111b67..d46df2f53e 100644 --- a/bsps/powerpc/virtex4/start/linkcmds +++ b/bsps/powerpc/virtex4/start/linkcmds @@ -209,13 +209,18 @@ SECTIONS * we can shorten the on-disk segment size. */ /* Initialised small data addressed as offsets from r13 */ - .sdata : { PROVIDE (_SDA_BASE_ = 32768); *(.sdata* .gnu.linkonce.s.*) } > RAM + .sdata : { + bsp_section_sdata_begin = .; + PROVIDE (_SDA_BASE_ = 32768); *(.sdata* .gnu.linkonce.s.*); + bsp_section_sdata_end = .; + } > RAM _edata = .; PROVIDE (edata = .); /* Zeroed small data addressed as offsets from r13 */ .sbss : { PROVIDE (__sbss_start = .); + bsp_section_sbss_begin = .; *(.dynsbss) *(.sbss*) *(.gnu.linkonce.sb.*) @@ -228,6 +233,11 @@ SECTIONS PROVIDE (__SBSS_END__ = .); PROVIDE (__sbss_end = .); + bsp_section_sbss_end = .; + bsp_section_sdata_libdl_begin = .; + . = DEFINED(bsp_section_small_data_area_size) ? + bsp_section_sdata_begin + bsp_section_small_data_area_size : .; + bsp_section_sdata_libdl_end = .; } > RAM .plt : { *(.plt) } > RAM diff --git a/bsps/powerpc/virtex5/start/linkcmds b/bsps/powerpc/virtex5/start/linkcmds index 32425f4c7f..9a5edf7643 100644 --- a/bsps/powerpc/virtex5/start/linkcmds +++ b/bsps/powerpc/virtex5/start/linkcmds @@ -209,13 +209,18 @@ SECTIONS * we can shorten the on-disk segment size. */ /* Initialised small data addressed as offsets from r13 */ - .sdata : { PROVIDE (_SDA_BASE_ = 32768); *(.sdata* .gnu.linkonce.s.*) } > RAM + .sdata : { + bsp_section_sdata_begin = .; + PROVIDE (_SDA_BASE_ = 32768); *(.sdata* .gnu.linkonce.s.*); + bsp_section_sdata_end = .; + } > RAM _edata = .; PROVIDE (edata = .); /* Zeroed small data addressed as offsets from r13 */ .sbss : { PROVIDE (__sbss_start = .); + bsp_section_sbss_begin = .; *(.dynsbss) *(.sbss*) *(.gnu.linkonce.sb.*) @@ -228,6 +233,11 @@ SECTIONS PROVIDE (__SBSS_END__ = .); PROVIDE (__sbss_end = .); + bsp_section_sbss_end = .; + bsp_section_sdata_libdl_begin = .; + . = DEFINED(bsp_section_small_data_area_size) ? + bsp_section_sdata_begin + bsp_section_small_data_area_size : .; + bsp_section_sdata_libdl_end = .; } > RAM .plt : { *(.plt) } > RAM diff --git a/cpukit/libdl/rtl-mdreloc-powerpc.c b/cpukit/libdl/rtl-mdreloc-powerpc.c index 5c52823a0f..0a9703984d 100644 --- a/cpukit/libdl/rtl-mdreloc-powerpc.c +++ b/cpukit/libdl/rtl-mdreloc-powerpc.c @@ -50,11 +50,16 @@ get_sda_base (void) static void* get_sdata_start (void) { +#if _ARCH_PPC64 + return NULL; +#else Elf_Addr addr; GET_ADDR(__SDATA_START__, addr); return (void*) addr; +#endif } +#if !_ARCH_PPC64 static size_t get_sdata_sbss_size (void) { @@ -74,6 +79,7 @@ get_sdata_libdl_size (void) GET_ADDR(bsp_section_sdata_libdl_end, end); return end - begin; } +#endif uint32_t rtems_rtl_elf_section_flags (const rtems_rtl_obj* obj, @@ -89,6 +95,7 @@ rtems_rtl_elf_arch_parse_section (const rtems_rtl_obj* obj, const Elf_Shdr* shdr, const uint32_t flags) { +#if !_ARCH_PPC64 struct { const char* label; size_t len; @@ -104,6 +111,7 @@ rtems_rtl_elf_arch_parse_section (const rtems_rtl_obj* obj, if (strncmp (name, prefix[p].label, prefix[p].len) == 0) return flags | RTEMS_RTL_OBJ_SECT_ARCH_ALLOC; } +#endif return flags; } @@ -111,6 +119,10 @@ bool rtems_rtl_elf_arch_section_alloc (const rtems_rtl_obj* obj, rtems_rtl_obj_sect* sect) { +#if _ARCH_PPC64 + rtems_rtl_set_error (ENOMEM, ".sdata no supported by ABI"); + return false; +#else if (rtems_rtl_trace (RTEMS_RTL_TRACE_DETAIL)) printf ("rtl: section: arch: alloc: name=%s size=%zu flags=%08" PRIx32 \ " order=%i link=%d info=%d\n", @@ -138,16 +150,19 @@ rtems_rtl_elf_arch_section_alloc (const rtems_rtl_obj* obj, } return true; +#endif } bool rtems_rtl_elf_arch_section_free (const rtems_rtl_obj* obj, rtems_rtl_obj_sect* sect) { +#if !_ARCH_PPC64 if (rtems_rtl_trace (RTEMS_RTL_TRACE_DETAIL)) printf ("rtl: section: arch: free: name=%s size=%zu\n", sect->name, sect->size); if (sdata != NULL) rtems_rtl_bit_alloc_bfree (sdata, sect->base, sect->size); +#endif return true; } -- 2.19.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel