This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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

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:

/* 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")))

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")))
#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))

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

Many thanks,
  R. Diez

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]