Nano Hash - криптовалюты, майнинг, программирование

Неопределенные символы при связывании OSMalloc.h с использованием clang в OS X

Здравствуйте и спасибо за вашу помощь.

Я пытаюсь создать простой «привет мир», используя только низкоуровневые вызовы ядра OS X для выделения памяти и записи в стандартный вывод. Почему? Я заканчиваю главу 8 второго издания K&R, посвященную написанию стандартной файловой библиотеки с нуля. Она, конечно, совершенно устарела, но концепция главы осталась. Во всяком случае, я не могу понять, как правильно связать, чтобы все заработало, и, таким образом, зарабатываю себе много хороших ошибок с неопределенными символами.

Я проанализировал множество других вопросов, вызывающих ту же ошибку, но не нашел ни одного адреса, как связать в библиотеке ядра, которую я пытаюсь использовать. Безумно длинный путь в третьем #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;
}

Makefile:

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 $@
    cp -v $@ $(BIN)/$@

$(ODIR)/%.o: %.c $(DEPS)
    mkdir -pv $(ODIR)
    $(CC) $(CFLAGS) -c -o $@ $<

Полученные ошибки:

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, если вам нужен низкоуровневый? Это будет соответствовать вашему использованию записи и не должно вызывать проблем с связыванием." (от CRD)

Использование «sbrk» (и его двоюродного брата «brk») было первоначальным путем, по которому я шел; однако на справочной странице для «sbrk» говорится: «Функции brk и sbrk — это исторические диковинки, оставшиеся с прежних дней, до появления управления виртуальной памятью». Это утверждение поставило меня на путь поиска замены. malloc — это, конечно, правильная и нормальная утилита для выделения памяти. Тем не менее, глава 8 K&R посвящена написанию собственных системных вызовов из базовой ОС. Итак, базовый вызов, который мне удалось найти для OS X Darwin, — это «OSMalloc», который я пытаюсь использовать.


  • Почему вы не используете систему sbrk звоните если хотите низкий уровень? Это будет соответствовать вашему использованию write и не должно вызывать проблем с связыванием. 14.08.2016
  • Использование «sbrk» (и его двоюродного брата «brk») было первоначальным путем, по которому я шел; тем не менее, справочная страница для 'sbrk' утверждает, что функции brk и sbrk являются историческими курьезами, оставшимися с прежних дней до появления управления виртуальной памятью. Это утверждение поставило меня на путь поиска замены. malloc — это, конечно, правильная и нормальная утилита для выделения памяти. Тем не менее, глава 8 K&R посвящена написанию собственных системных вызовов из базовой ОС. Итак, базовый вызов, который мне удалось найти для OS X Darwin, — это «OSMalloc», который я пытаюсь использовать. 14.08.2016
  • Вы можете посмотреть vm_allocate, Apple показывает пример использования в этом документе 14.08.2016

Ответы:


1

OSMalloc доступен только для написания самого ядра (расширений ядра, драйверов устройств). Пользовательские программы должны использовать sbrk.

14.08.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..