Issue #2463 has been updated by Antonio Huete Jimenez.

According to vsrinivas the problem is that our sys/errno.h is a C-only
header. He pointed out the solution would be wrapping errno and
__errno() between BEGIN_DECLS and END_DECLS macros.

2012/11/27 David Shao via Redmine <[email protected]>:
>
> Issue #2463 has been reported by David Shao.
>
> ----------------------------------------
> Bug #2463: __thread storage class for errno may break Firefox 17.0esr C++ 
> compilation
> http://bugs.dragonflybsd.org/issues/2463
>
> Author: David Shao
> Status: New
> Priority: Normal
> Assignee:
> Category:
> Target version:
>
>
> Executing the commands on the file cpperrno.cpp
> $ c++ cpperrno.cpp
> $ ./a.out
> produces the output:
> errno = 22
> on NetBSD amd64, FreeBSD amd64, and Linux amd64 (Ubuntu 12.04 LTS).
> However on DragonFly the output is an error message:
> $ c++ cpperrno.cpp
> /tmp//ccTk4OGn.o: In function `(anonymous namespace)::__error()':
> cpperrno.cpp:(.text+0x10): undefined reference to `(anonymous 
> namespace)::errno'
>
> This matters because the file cpperrno.cpp is a minimal example demonstrating 
> build breakage of current pkgsrc devel/xulrunner for Firefox 17.0esr, as 
> reported in a followup to PR pkg/47233.
>
> The difference appears to be that on DragonFly in file sys/sys/errno.h, there 
> is the declaration:
>
> #if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL)
> extern __thread int   errno;
>
> Obviously there are reasons to use storage class keyword __thread for errno; 
> nonetheless, the breakage of compilation for Firefox 17.0esr on no platform 
> but DragonFly indicates some alternative solution must be devised for porting 
> C++ userland programs.
>
> /* begin cpperrno.cpp */
> namespace {
>
> #pragma GCC visibility push(default)
> #include <errno.h>
> #pragma GCC visibility pop
>
> void innamespace() {
>         errno = EINVAL;
> }
>
> } /* end namespace */
>
> extern "C" {
>
> void seterrno() {
>         innamespace();
> }
>
> } /* end extern */
>
> #include <stdio.h>
> #include <errno.h>
>
> int main() {
>         seterrno();
>         printf("errno = %d\n", errno);
>         return errno;
> }
> /* end cpperrno.cpp */
>
>
> --
> You have received this notification because you have either subscribed to it, 
> or are involved in it.
> To change your notification preferences, please click here: 
> http://bugs.dragonflybsd.org/my/account
----------------------------------------
Bug #2463: __thread storage class for errno may break Firefox 17.0esr C++ 
compilation
http://bugs.dragonflybsd.org/issues/2463

Author: David Shao
Status: New
Priority: Normal
Assignee: 
Category: 
Target version: 


Executing the commands on the file cpperrno.cpp
$ c++ cpperrno.cpp
$ ./a.out
produces the output:
errno = 22
on NetBSD amd64, FreeBSD amd64, and Linux amd64 (Ubuntu 12.04 LTS).
However on DragonFly the output is an error message:
$ c++ cpperrno.cpp
/tmp//ccTk4OGn.o: In function `(anonymous namespace)::__error()':
cpperrno.cpp:(.text+0x10): undefined reference to `(anonymous namespace)::errno'

This matters because the file cpperrno.cpp is a minimal example demonstrating 
build breakage of current pkgsrc devel/xulrunner for Firefox 17.0esr, as 
reported in a followup to PR pkg/47233.

The difference appears to be that on DragonFly in file sys/sys/errno.h, there 
is the declaration:

#if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL)
extern __thread int   errno;

Obviously there are reasons to use storage class keyword __thread for errno; 
nonetheless, the breakage of compilation for Firefox 17.0esr on no platform but 
DragonFly indicates some alternative solution must be devised for porting C++ 
userland programs.

/* begin cpperrno.cpp */
namespace {

#pragma GCC visibility push(default)
#include <errno.h>
#pragma GCC visibility pop

void innamespace() {
        errno = EINVAL;
}

} /* end namespace */

extern "C" {

void seterrno() {
        innamespace();
}

} /* end extern */

#include <stdio.h>
#include <errno.h>

int main() {
        seterrno();
        printf("errno = %d\n", errno);
        return errno;
}
/* end cpperrno.cpp */


-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://bugs.dragonflybsd.org/my/account

Reply via email to