[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.
Regards,
- 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
Problems:
[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
variables
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
[-Wimplicit-function-declaration]
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
[PASS] DISPATCH_SOURCE_TYPE_READ
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