Sorry, I'm only certified for beginner questions. :)
As you know, the macho format is new to Nasm, and not yet well-documented. I know almost nothing about it, and very little about PIC. There's a section in the Manual on writing shared libraries for Linux/BSD, which may or may not apply to macho. In "outmacho.c", I see a reference to "pcrel", but I don't know how to use it.
Here's a newbie example (for Linux) that finds the data - "pretending", in this case, to not know...
;------------------
global _start
section .text
_start:
jmp get_data_address
got_data_address:
pop ecx
mov edx, msg_len
mov ebx, 1
mov eax, 4
int 80h
mov eax, 1
int 80h
section .data
get_data_address:
call got_data_address
msg db "hello word [sic]", 10
msg_len equ $ - msg
;--------------------------
I thought we'd need to put the data in the ".text" section - which would make it read-only, but it works with some code in ".data", too. I really don't think that's "right!
The same technique should work in macho, but I don't see how it'll help with anything that needs to be declared global or external.
I'll try to get you a better answer...
Best,
Frank