2010-03-13 3 views

답변

2

나는이 페이지가 표준 GCC 매뉴얼에 씌어있는 애플 스타일 시트라고 믿는다. Mac OS X에서 .dylib 대신 .so이 표시됩니다.

Mac에서는 gcc가 __thread을 지원하지 않을 가능성이 있습니다. 수동으로 pthread_setspecific을 사용해야합니다.

(This problem has been filed as a bug.)

+0

[리눅스 프로그래밍 인터페이스 : 리눅스 및 UNIX 시스템 프로그래밍 핸드북] (http://www.amazon.com/dp/159 3272200), 스레드 로컬 저장소 (정적 및 전역 선언에서'__thread')에 GCC 3.3 이상이 필요합니다. Mac OS X는 GCC 4.2와 함께 제공되기 때문에 Apple이 기능을 제거한 것처럼 보입니다 (또는 다시 포팅하지 않았을 때). 또한 커널 지원이 필요합니다 (Linux 2.6 이상). 왜 애플이 그것을 제공하지 않았는지를 설명 할 수있다. – jww

+0

이것은 우리가 여전히 Mac OS X (10.10)에서 컴파일 할 수 없다는 것을 의미합니까? PyMetis (pip install pymetis)와'gcc --version'을 설치하려고 할 때 동일한 문제가 있습니다 :'Apple LLVM version 7.0.2 (clang-700.1.81) 대상 : x86_64-apple-darwin14.5.0 스레드 모델 : posix' 그러나'brew install gcc49'를 사용하여 gcc v 4.9를 설치했습니다. – sAguinaga

4
gcc가-4.5 위 또는 (MacPorts를 또는 무언가를 통해) 당신의 GCC를 업그레이드

. Mac에서 TLS 작업은 에뮬레이트되기 때문에 Linux 나 다른 유닉스에서보다 훨씬 비쌉니다.

다음 코드 :

 
__thread int foo; 
void f() { 
    ++foo; 
} 

리눅스에서, 그것은이로 번역 할 것이다 :

 
f: 
    pushl %ebp 
    movl %esp, %ebp 
    movl %gs:[email protected], %eax 
    addl $1, %eax 
    movl %eax, %gs:[email protected] 
    popl %ebp 
    ret 

하지만 맥에

, 그것은 (이 함수 호출!)이 번역 될 것이다 : 에서 Kerrisk에 따르면

 
_f: 
LFB0: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    pushq %rbx 
LCFI2: 
    subq $8, %rsp 
LCFI3: 
    leaq ___emutls_v.foo(%rip), %rdi 
    call ___emutls_get_address 
    movl (%rax), %eax 
    leal 1(%rax), %ebx 
    leaq ___emutls_v.foo(%rip), %rdi 
    call ___emutls_get_address 
    movl %ebx, (%rax) 
    addq $8, %rsp 
    popq %rbx 
    leave 
LCFI4: 
    ret 
+1

Apple Tech Lab에서이 문제에 대해 바보입니다. 그들은 레지스터를 낭비하고 세그먼트 레지스터가 더 이상 다른 용도로 사용할 수 없다는 사실을 깨닫지 못하게합니다. 정말 안됐다. 경우에도 "__emutls_get_address"는 단지 하나의 movl 명령을 수행하고 있습니다. 그래서 누군가가 충분히 용감하다면, 어셈블러가 리눅스에서 행해진 것처럼 인라인으로 수동으로 코딩 할 수 있습니다. 그건 그렇고,이게 진짜 분해입니까? 나는 항상 TLS에 사용되는 FS라고 생각했다. – Lothar

관련 문제