Minix: отменить определение ссылки на __fts_open60

Я пытаюсь сделать системный вызов, который вернет номер инода файла, и решил использовать структуры FTS и FTSENT, так как я нашел их при поиске, и они также используются в ls.c (обычной программы ls, которая с -i дает нам номера инодов).

Чтобы все было плотно упаковано, я добавил две функции внизу table.c в /usr/src/servers/vfs.

Это ошибка (для полноты):

table.o: In function 'do_inode_nr':
table.c:(.text+0x1f): undefined reference to __fts_open60
table.c:(.text+0x50): undefined reference to __fts_read60
clang: error: linker command failed with code 1 (use -v for invocation)

Я не могу использовать -v, потому что я строю make hdboot из /usr/src/releasetools.

Код:

//forward declaration of the functions before the table itself
//table and default stuff

//after all this
#include "fts.h"

int do_inode_nr()
{
    FTS* s = fts_open(&m_in.m1_p1, 0, NULL);
    printf("%s", s? "got inode\n" : "failed to get inode\n");
    if(s == NULL) return -1;
    FTSENT* p = fts_read(s);
    printf("%d", p->fts_ino);
    return p->fts_ino;
}

дополнительные примечания:

В: Это проект? Ты пытаешься заставить нас делать твою домашнюю работу? A: Да, это проект для класса, но, очевидно, я уже нашел ответ, которым я доволен, и прошу помощи в решении ошибки компоновщика, я не прошу решения, не оскорбляйте меня, утверждая, что я Мне лень решать это самостоятельно (на всякий случай :) )

В: Почему в table.c? A: Мы должны сделать патч с помощью git, но, как известно, было немного сложно убедить добавить новые файлы в патч, поэтому я придерживаюсь table.c, который в любом случае включен в патч. говоря, я знаю, что обычно должен помещать новый код в отдельные файлы и т. д., но, учитывая тот факт, что я не собираюсь делать намного больше, так действительно проще.

В: Рассматривал ли я другие альтернативы? A: Кажется, я единственный, кто обратился к структуре FTS, я бы предпочел, чтобы она работала, как ожидалось, и выдавало уникальное решение, чем просто делать то, что делают все остальные. Как только начнутся льготные дни, я тоже попробую по-другому.

Вопрос: Вы его смотрели? A: Ага, придумал очень мало, но не могу сказать, что это чем-то помогло.

Заранее спасибо за любую попытку помочь.


person user3079666    schedule 26.05.2016    source источник


Ответы (1)


Это не сработает. Задача VFS состоит в том, чтобы передавать запросы ввода-вывода правильному «драйверу», который будет его обслуживать. open и read в вашем коде — это способы выполнения таких запросов. Но VFS может обрабатывать запросы только от "пользовательских" программ; он не может вызывать сам себя. Использование ls.c в качестве источника для модификации VFS было плохой идеей.

Вам нужно заменить вызовы open и read эффектом, который они имеют в пределах VFS, используя eat_path и тому подобное.

person AntoineL    schedule 12.06.2016