2016-08-13 5 views
0

안녕하십니까 도움을 주셔서 감사합니다.OS X에서 clang을 사용하여 OSMalloc.h를 연결하는 동안 정의되지 않은 기호

메모리를 할당하고 stdout에 쓰려면 저급 OS X 커널 호출 만 사용하여 간단한 'hello world'를 만들려고합니다. 왜? 제 2 판 K & R의 8 장을 끝내고 있습니다.이 파일은 표준 파일 라이브러리를 처음부터 작성하는 데 초점을 맞추고 있습니다. 물론 완전히 시대에 뒤떨어졌지만이 장의 개념은 그대로 남아 있습니다. 어쨌든, 나는 올바르게 작동하는 모든 것을 얻는 방법을 알아낼 수 없어서 정의되지 않은 좋은 심볼 오류를 많이 낳고 있습니다.

동일한 오류를 일으키는 다른 많은 질문을 통해 구문 분석했지만 사용하려고 시도하고있는 커널 라이브러리에서 링크하는 방법을 찾지 못했습니다. 세 번째 #include에있는 긴 경로는 링크 오류가 발생하기 전에 컴파일해야합니다.

강령 :

#include <fcntl.h> 
#include <unistd.h> // equivalent to (K&R) #include "syscalls.h" 
#include </Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/libkern/OSMalloc.h> // for low-level memory allocation 

#define MINSTDIOTAG "com.apple.minstdio" // Used by OSMalloc from <libkern/OSMalloc.h> 
#define PAGE_SIZE_64K (64 * 1024)  // Page size to allocate 

int main(void) { 

    char *base = NULL; // Memory buffer 
    char *ptr  = base; // Location in buffer 

    // Create tag 
    OSMallocTag mytag = OSMalloc_Tagalloc(MINSTDIOTAG, OSMT_DEFAULT); 

    // Attempt to allocate PAGE_SIZE_64K of memory 
    if ((base = (char *)OSMalloc(PAGE_SIZE_64K, mytag)) == NULL) 
     return 1; 
    ptr = base; 

    // Stuff the buffer with stuff 
    *ptr++ = 'f'; 
    *ptr++ = 'o'; 
    *ptr++ = 'o'; 
    *ptr++ = '\n'; 
    *ptr = '\0'; 

    // Write it out to stdout 
    (void)write(STDOUT_FILENO, base, (size_t)(ptr - base)); 

    // Free allocated memory 
    OSFree(base, PAGE_SIZE_64K, mytag); 

    // Get out of Dodge City, Kansas 
    return 0; 
} 

메이크 :

BIN = ../../bin 
ODIR = obj 
CC = cc 
CFLAGS = -std=c99 -Wall -g -I. 
_OBJ = minstdio3.o 
_BIN = minstdio3 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 

.PHONY: all clean 

all: $(_BIN) 

clean: 
    rm -rv $(ODIR) $(_BIN) 

minstdio3: $(ODIR)/minstdio3.o 
    $(CC) $(CFLAGS) $^ -o [email protected] 
    cp -v [email protected] $(BIN)/[email protected] 

$(ODIR)/%.o: %.c $(DEPS) 
    mkdir -pv $(ODIR) 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

오류받은 :

Todds-MBP-2:cbasics todddecker$ make 
mkdir -pv obj 
cc -std=c99 -Wall -g -I. -c -o obj/minstdio3.o minstdio3.c 
cc -std=c99 -Wall -g -I. obj/minstdio3.o -o minstdio3 
Undefined symbols for architecture x86_64: 
    "_OSFree", referenced from: 
     _main in minstdio3.o 
    "_OSMalloc", referenced from: 
     _main in minstdio3.o 
    "_OSMalloc_Tagalloc", referenced from: 
     _main in minstdio3.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[2]: *** [minstdio3] Error 1 

는 - 편집 -

"왜 당신은을 사용하지 않는 sbrk syste 저급을 원하면 전화 해? 이 쓰기의 사용을 일치합니다 및 연결 문제를주지해야한다 " '는 sbrk'를 사용

(CRD에서) (그리고 사촌 'BRK'이다) 나는 아래로 향하고 된 원래 경로이었다. 그러나 , 'sbrk'에 대한 맨 페이지는 "가상 메모리 관리의 출현 전날부터 brk 및 sbrk 기능은 역사적인 호기심입니다."이 진술은 그 대체물을 발견하려고하는 길에 나를 몰아 넣었습니다. 'malloc' 물론, 메모리 할당을위한 정확하고 정상적인 유틸리티입니다. 그러나 K & R은 기본 OS 시스템 호출에서 직접 작성하는 것에 관한 내용입니다. 따라서 OS X Darwin에서 찾을 수 있었던 기본 호출은 'OSMalloc '사용하려고합니다.

+1

원한다면 ['sbrk' 시스템 호출] (https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man2/brk.2.html)을 사용하지 않는 이유는 무엇입니까? 낮은 수준? 이것은'write'의 사용과 일치 할 것이고 연결 문제를주지 않아야합니다. – CRD

+0

'sbrk'(그리고 그것의 사촌 'brk')를 사용하는 것은 원래의 길이었습니다. 그러나 'sbrk'에 대한 맨 페이지에는 "가상 메모리 관리의 출현 전날부터 brk 및 sbrk 기능은 역사적인 호기심입니다." 이 성명서는 나를 대신하여 그 보충을 찾으려는쪽으로 나아 갔다. malloc은 물론 메모리 할당을위한 정확하고 일반적인 유틸리티입니다. 그러나 K & R Chapter 8은 기본 OS 시스템 호출에서 직접 작성하는 것에 관한 것입니다. 그래서, 제가 OS X Darwin에서 찾을 수 있었던 기본 호출은 제가 사용하려고하는 'OSMalloc'입니다. – ptdecker

+0

당신은'vm_allocate'을 보길 원할 것입니다, 애플은 샘플 사용법을 보여줍니다 (이 문서에서) (https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/MemoryAlloc.html) – CRD

답변

0

OSMalloc은 커널 자체 (커널 확장, 장치 드라이버) 작성에만 사용할 수 있습니다. 사용자 프로그램은 sbrk를 사용해야합니다.