2016-09-09 2 views
1

스위프트 모듈의 함수에 @_silgen_name attr을 사용하여 c와 상호 작용할 수 있음을 알고 있습니다. 어셈블리 파일에 정의 된 심볼을 사용하여이 작업을 수행 할 수 있습니까? 스위프트를 사용하여 syscalls를 만들고 싶습니다. 이것이 내가 묻는 이유입니다.swift에서 어셈블리에 정의 된 함수 호출

+0

컴파일 된 개체 파일은 C로 컴파일되었는지 또는 어셈블리 언어로 어셈블 된 것인지 알 수 없습니다. –

+0

@PaulGriffiths 컴파일러는 swm 모듈을 컴파일 할 때 asm 파일의 기호가 어디에 있는지 어떻게 알 수 있습니까? –

+0

심볼이 C 소스 파일과 어디에 있는지를 아는 것과 똑같은 방법으로 오브젝트 파일의 심볼 테이블에서 심볼을 찾습니다. –

답변

2

브리지 header.h 파일을 만들고이 파일의 함수 프로토 타입을 넣습니다. 예를 들어

어셈블리 코드 :

.globl _add // make it global so that others can find this symbol 
.... 
_add: // int add(int a, int b) 
    movl %esi, %eax 
    addl %edi, %eax 
    ret 

그런 header.h가 파일을 브리징에

int add(int a, int b); 

또는

는 신속한 모듈의 상단이 정의

@_silgen_name("add") func add(a: Int32, b: Int32) -> Int32 

다음 신속하게 사용할 수 있습니다 :

let a = add(1, 2); 
+0

어셈블리 파일을 링크하기 위해 swiftc 컴파일러에 어떤 플래그를 전달합니까? –

+0

동일한 XCode 프로젝트에 넣기 만하면됩니다. –

+0

나는 리눅스에서 xcode를 사용하지 않고있다. –

관련 문제