안녕하십니까 도움을 주셔서 감사합니다.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 '사용하려고합니다.
원한다면 ['sbrk' 시스템 호출] (https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man2/brk.2.html)을 사용하지 않는 이유는 무엇입니까? 낮은 수준? 이것은'write'의 사용과 일치 할 것이고 연결 문제를주지 않아야합니다. – CRD
'sbrk'(그리고 그것의 사촌 'brk')를 사용하는 것은 원래의 길이었습니다. 그러나 'sbrk'에 대한 맨 페이지에는 "가상 메모리 관리의 출현 전날부터 brk 및 sbrk 기능은 역사적인 호기심입니다." 이 성명서는 나를 대신하여 그 보충을 찾으려는쪽으로 나아 갔다. malloc은 물론 메모리 할당을위한 정확하고 일반적인 유틸리티입니다. 그러나 K & R Chapter 8은 기본 OS 시스템 호출에서 직접 작성하는 것에 관한 것입니다. 그래서, 제가 OS X Darwin에서 찾을 수 있었던 기본 호출은 제가 사용하려고하는 'OSMalloc'입니다. – ptdecker
당신은'vm_allocate'을 보길 원할 것입니다, 애플은 샘플 사용법을 보여줍니다 (이 문서에서) (https://developer.apple.com/library/ios/documentation/Performance/Conceptual/ManagingMemory/Articles/MemoryAlloc.html) – CRD