[DragonFlyBSD - Bug #2463] __thread storage class for errno may break Firefox 17.0esr C++ compilation

David Shao via Redmine bugtracker-admin at leaf.dragonflybsd.org
Mon Nov 26 21:32:35 PST 2012

Issue #2463 has been reported by David Shao.

Bug #2463: __thread storage class for errno may break Firefox 17.0esr C++ compilation

Author: David Shao
Status: New
Priority: Normal
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() {

} /* end extern */

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

int main() {
	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

More information about the Bugs mailing list