2015-07-11 2 views
3

Мне в основном нужно настроить несколько интерфейсов системного вызова (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?

ответ

3

Откуда, где именно в libc, логика логики с открытым() логически завершена?

В происходит от sysdeps/unix/syscall-template.S

Как компоновщик сможет успешно подключить функцию открытой(), когда нет функции явно названа открытая в LibC исходного дерева?

Если вы препроцессировать выше источника с правильной -DSYSCALL_SYMBOL=..., вы обнаружите, что там есть упоминание о open в источнике.

+0

Спасибо за указатель. На данный момент я просто пытаюсь поместить инструкцию puts() перед вызовом функции open(). Любые указатели (кроме параметра ld wrap) о том, как/куда помещать это в исходный код? Я знаю, что в исходных источниках libc есть макрос, который сводится к встроенному сбору сборки в указанном файле. –

+0

Файл sysdeps/unix/sysv/linux/wordsize-64/open64.c пуст, из-за чего мы достигаем шаблона syscall.Как вы думаете, добавление логики здесь (как и xstat64.c) приведет к новой логике и вызовет фактический sys_open –