How to check at compilation time whether -msdata is set to eabi for PowerPC embedded targets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi there:

I am building a GCC 4.5.3 cross-compiler for an embedded PowerPC target, together with binutils-2.21 and newlib 1.19.0, and I cannot compile newlib with switch -msdata=eabi . There are 2 related error messages:

1) newlib-1.19.0/newlib/libc/reent/impure.c:28:48: error: _global_impure_ptr causes a section type conflict

2) /tmp/ccteCPAo.s:2630: Warning: setting incorrect section attributes for .sdata2

It turns out that newlib wants to decide itself where to place the global variables _impure_ptr and _global_impure_ptr. If I do not set -msdata at all, or set it to -msdata=sysv , then both of these variables should land in section .sdata , and that's also what newlib specifies in this way:

[newlib-1.19.0/newlib/libc/include/sys/config.h]
/* For the PowerPC eabi, force the _impure_ptr to be in .sdata */
#if defined(__PPC__)
#if defined(_CALL_SYSV)
#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))
#endif

There is agreement, so compilation works. The trouble is, if you specify -msdata=eabi , GCC would normally place _global_impure_ptr in .sdata2, because that variable is declared as 'const'. But newlib insists on placing it in .sdata with the above construction. There is disagreement, therefore the build fails.

Before I report this issue to the newlib developers, or try somehow to fix it myself, there are a few things I would like to clarify here:

1) I thought with __attribute__((__section__(".sdata"))) one can decide where a variable lands. I guess there are restrictions on the type of section, or is there some other kind of problem here?

2) Does it make any sense that newlib wants to decide where a particular variable lands? I though GCC would always automatically get it right.

3) How can I check at compilation time whether -msdata is set to eabi? Symbol __PPC__ is defined for the PowerPC, and symbol _CALL_SYSV is not properly documented, but I guess it gets defined by -meabi . Does GCC need a new symbol for the current -msdata type? With such a symbol, I could write code like this:

#if defined(_PPC_MSDATA_EABI)
#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata2")))
#else
#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))
#endif

Please copy me on the answer, as I'm not subscribed to this list.

Many thanks,
  R. Diez




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux