Reference bsp_section_data_start from C yields "R_PPC_EMB_SDA21 relocation is in the wrong output section"

Eric Norum wenorum at lbl.gov
Mon May 17 15:53:16 UTC 2010


On May 16, 2010, at 8:52 PM, Till Straumann wrote:

> I did that, too, but you have to know what you are doing.
> 
> This trick *only* works if you know that your symbol is
> in the 'data' area and you want to avoid the compiler to
> assume it to be in the short data area.
> 
> E.g., if you know our symbol is .text then you would declare
> it as a function, of course.
> 
> Using a section __attribute__ is IMO preferable.

I must be missing something.   Here's a section of the uc5282 BSP linkcmds:
SECTIONS
{

    _header_offset = 0;

    /*
     * Text, data and bss segments
     */
    .text _DownloadLocation : {

        *(.text*)
        *(.ram_code)

        /*
         * C++ constructors/destructors
         */
        *(.gnu.linkonce.t.*)

        /*
         * Initialization and finalization code.
         *
         * Various files can provide initialization and finalization
         * functions.  crtbegin.o and crtend.o are two instances. The
         * body of these functions are in .init and .fini sections. We
         * accumulate the bodies here, and prepend function prologues
         * from crti.o and function epilogues from crtn.o. crti.o must
         * be linked first; crtn.o must be linked last.  Because these
         * are wildcards, it doesn't matter if the user does not
         * actually link against crti.o and crtn.o; the linker won't
         * look for a file to match a wildcard.  The wildcard also
         * means that it doesn't matter which directory crti.o and
         * crtn.o are in.
         */
        PROVIDE (_init = .);
        *crti.o(.init)
        *(.init)
        *crtn.o(.init)
        PROVIDE (_fini = .);
        *crti.o(.fini)
        *(.fini)
        *crtn.o(.fini)

        /*
         * Special FreeBSD sysctl sections.
         */
        . = ALIGN (16);
        __start_set_sysctl_set = .;
        *(set_sysctl_*);
        __stop_set_sysctl_set = ABSOLUTE(.);
        *(set_domain_*);
        *(set_pseudo_*);

=================================


In a C program I tried:
extern char __start_set_sysctl_set[];
printf("%ld\n", (unsigned long)__start_set_sysctl_set);

This compiled and linked with no complaints even though the symbol is in the text segment:
 m68k-rtems4.10-nm example | grep __start_set_sysctl_set
00143360 T __start_set_sysctl_set

Am I venturing into 'undefined behaviour' territory?
-- 
Eric Norum
wenorum at lbl.gov




More information about the users mailing list