Re: gcc 4.9.2 on rhel5

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

 



On 07/27/2015 09:12 PM, Jonathan Wakely wrote:
> On 27 July 2015 at 19:03, Ricardo Telichevesky wrote:
>> Hello,
>>
>> Trying to compile gcc 4.9.2 on rhel5. Eventually got it compiled. Not sure
>> what I did wrong, but in certain cases when using
>> gcc -c ... the compiler "sticks"  some unwanted  symbols like:
>>
>> _strcspn_c1
>> _strcpsn_c2
>> _strspn_c1
>>
>> that obviously cause troubles when linking because each .o has this pesky
>> stuff on it. Does it ring any bell? Anyone would know what triggers the
>> compiler to automagically stick those symbols as globals in the code?
> 
> No idea. How did you configure gcc? ('gcc -v' will tell you).
> 

Though I don't have an RHEL box, I think CentOS 5 should have somewhat similar
package versions, and I remember having similar problems with that distro. The
problem is caused by glibc headers (version 2.5-123.el5_11.1):

/usr/include/bits/string2.h:

[snip]

#ifndef __STRING_INLINE
# ifdef __cplusplus
#  define __STRING_INLINE inline
# else
#  define __STRING_INLINE extern __inline
# endif
#endif

[snip]

__STRING_INLINE size_t __strcspn_c1 (__const char *__s, int __reject);
__STRING_INLINE size_t
__strcspn_c1 (__const char *__s, int __reject)
{
  register size_t __result = 0;
  while (__s[__result] != '\0' && __s[__result] != __reject)
    ++__result;
  return __result;
}

Because of C99 inline semantics, out-of-line __strcspn_c1 will be defined with
external linkage. In CentOS 6 (glibc 2.12-1.149.el6_6.9) this was fixed like this:

#ifndef __STRING_INLINE
# ifdef __cplusplus
#  define __STRING_INLINE inline
# else
#  define __STRING_INLINE __extern_inline
# endif
#endif

And __extern_inline is defined in /usr/include/sys/cdefs.h:

#  define __extern_inline extern __inline __attribute__ ((__gnu_inline__))

One possible workaround (which worked OK for me) is to use -fgnu89-inline flag.
Though I think there is a better solution.
Probably defining __STRING_INLINE to something appropriate (like "extern __inline
__attribute__ ((__gnu_inline__))") before including glibc headers will help.

-- 
Regards,
    Mikhail Maltsev



[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