Как я могу встроить встроенную сборку для вызова sys_unlink? - PullRequest
0 голосов
/ 01 января 2011

Я пытаюсь вызвать sys_unlink с помощью встроенной сборки, например:

 int sys_unlink(const char *filename) {

    int ret;

    __asm__("int $0x80" : "=a"(ret) : "a"(10), "b"(filename));

    return ret;

}

Но это не работает, всегда возвращает -14.

Я хотел бызнаю, если этот код правильный, так как я не знаю много сборок.

Ответы [ 2 ]

3 голосов
/ 01 января 2011

Я не думаю, что вы можете заставить эту работу даже ограничиться одной платформой под Linux: современный способ для Linux создавать системные вызовы - через заглушку, предоставляемую ядром и связанную через VDSO. Даже библиотека, с которой вы ссылаетесь, не знает (не нужно , чтобы знать ), что такое соглашение о системных вызовах - она ​​просто извлекает ссылку из VDSO. Он получает ссылку на VDSO через магический параметр, который скрывается сразу после environ, а затем обрабатывает его как любую другую динамическую библиотеку. Ядро выбирает соглашение о системных вызовах на основе возможностей процессора.

Я знаю (потому что я пытался это сделать!), Что трудно получить доступ к этим символам VDSO. glibc не экспортирует их (или любые полезные ссылки на них) для вас. Единственный работающий способ, который я видел, это проверить свой собственный /proc/self/maps, чтобы найти VDSO, а затем использовать для этого dl функции (повторяя некоторые из настроек glibc).

3 голосов
/ 01 января 2011

Этот код корректен только для 32-разрядного процесса x86 - он не использует правильный номер системного вызова для процесса x86-64.Используйте __NR_unlink из asm/unistd.h вместо жестко заданного 10:

#include <asm/unistd.h>

int sys_unlink(const char *filename)
{
    int ret;

    asm("int $0x80" : "=a"(ret) : "a"(__NR_unlink), "b"(filename));
    return ret;
}

Если вы компилируете 32-битный процесс, тогда -14 равен EFAULT, указываяпроблема с именем файла, который вы передаете.Как ты это называешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...