Мне в основном нужно настроить несколько интерфейсов системного вызова (sys_open) для моей цели. Я очень хорошо знаю опцию GNU Linker ld -wrap = и и использую эту логику для изменения оболочки open() libc. Хотя это и служит цели, я действительно хочу знать, где в исходных кодах libc вступает реальная реализация.Откуда он находится в исходном коде libc() (?)?
Следующие два места мои главные подозреваемые (Обратите внимание, что fcntrl.h имеет только заявления)
- GLIBC_DIR/Io/open.c
- GLIBC_DIR/порты/sysdeps/Unix/SysV/Linux/общий/open.c
Пример драйвера:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int fd;
if ((fd = open("sample.c", O_RDONLY)) == -1) {
fprintf(stderr, "file not found\n");
exit(1);
}
return 0;
}
Обеспокоена сниппет:
main:
401dd1: bf 44 90 48 00 mov $0x489044,%edi
401dd6: b8 00 00 00 00 mov $0x0,%eax
401ddb: e8 10 03 03 00 callq 4320f0 <__libc_open>
......
......
__libc_open:
4320f0: 83 3d 69 8e 28 00 00 cmpl $0x0,0x288e69(%rip)
4320f7: 75 14 jned <__open_nocancel+0x14>
__open_nocancel:
4320f9: b8 02 00 00 00 mov $0x2,%eax
4320fe: 0f 05 syscall
Для простоты я подготовил все LibC источники исполняемых статически. Также был достаточно осторожен, чтобы GCC правильно подобрал пользовательский libc.a. Я попробовал добавить инструкцию puts, но упомянутые два исходных кода НЕ запускаются вообще. Взглянув на сборку исполняемого файла [показано выше], вызов sys_open (0x2 в __open_nocancel) был каким-то образом помещен в исполняемый файл.
Так что мой вопрос заключается в следующем:
- От того, где именно в LIBC, открытый() код логики о связанных волшебно пришел?
- Как компоновщик может успешно подключить функцию open(), когда нет функции, явно названной open в дереве исходных текстов libc?
Спасибо за указатель. На данный момент я просто пытаюсь поместить инструкцию puts() перед вызовом функции open(). Любые указатели (кроме параметра ld wrap) о том, как/куда помещать это в исходный код? Я знаю, что в исходных источниках libc есть макрос, который сводится к встроенному сбору сборки в указанном файле. –
Файл sysdeps/unix/sysv/linux/wordsize-64/open64.c пуст, из-за чего мы достигаем шаблона syscall.Как вы думаете, добавление логики здесь (как и xstat64.c) приведет к новой логике и вызовет фактический sys_open –