[libdispatch-dev] linux + libdispatch + clang + blocks

Mark Heily mark at heily.com
Mon Jun 7 19:02:53 PDT 2010

I have been able to compile libdispatch on Linux with a blocks-enabled clang 
and ran into some issues. The biggest problem is <unistd.h> in the GNU libc 
declares a function which takes an argument named "__block" which causes an 
error when compiling with Clang. This has been reported as a bug to GNU and 
rejected by drepper@ as a WONTFIX bug.

I'll submit some patches soon to address these issues, but see below for a 
list of what I encountered and the "fix" used to get it to work.


  - Mark

Build environment:

   clang version 1.1 (branches/release_27)
   Target: x86_64-pc-linux-gnu

Build Commands:

   cd ~/src/libdispatch	
   sh ./autogen.sh && CC=clang CFLAGS=-fPIC ./configure && make clean && make


[1] __block used within unistd.h declaration

In file included from ./internal.h:35:
In file included from ../dispatch/dispatch.h:36:
/usr/include/unistd.h:1128:35: error: __block attribute not allowed, only 
allowed on local
extern void encrypt (char *__block, int __edflag) __THROW __nonnull ((1));

	fix: edit unistd.h and remove the __block identifier

	see: http://sources.redhat.com/bugzilla/show_bug.cgi?id=11157

[2] two private_extern variables cause compile failures.

/usr/bin/ld: .libs/libdispatch_la-queue_kevent.o: relocation R_X86_64_PC32 
against symbol `_dispatch_safe_fork' can not be used when making a shared 
object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value

	fix: remove __private_extern__ from variable declarations

[3] clang wants arc4random defined

	fix: add u_int32_t arc4random(); to source

[4] clang doesn't like __unused

dispatch_after.c:32:21: error: expected ')'
void done(void *arg __unused) {
dispatch_after.c:32:10: note: to match this '('
void done(void *arg __unused) {

	fix: delete this attribute

[5] fabs() undefined symbol

dispatch_drift.o: In function `__main_block_invoke_':
dispatch_drift.c:(.text+0x529): undefined reference to `fabs'

	fix: add -lm to testing/Makefile.am

[6] fgetln() not declared

summarize.c:69:8: warning: implicit declaration of function 'fgetln' is 
invalid in C99
                 ln = fgetln(stdin, &len);

	fix: add declaration: char *fgetln(FILE *fp, size_t *lenp);

[7] Dispatch Source Read test failed

[TEST] Dispatch Source Read
[PID] 8515

	Actual: 0x603200
	Expected: 0x603200
[PASS] dispatch_get_main_queue
	Actual: 0x12dd010
	Expected: 0x12dd010
bytes available: 1
bytes read: 512000
^^^^^ hung here, process 8515 was defunct and I killed it manually
/bin/bash: line 5:  8515 Terminated              ${dir}$tst
FAIL: dispatch_read

	fix: none as of yet

More information about the libdispatch-dev mailing list