вопрос про dir620

Тема в разделе "Флудилка", создана пользователем Igor68, 20 сен 2019.

  1. parovoZZ

    parovoZZ Гуру

    про какую ардуину речь? Мы здесь трем за ядро Linux. А если точнее, то за свадьбу стандартного (не самописного) веб сервера и приложения на сях.

    Вот это я почитаю.
     
  2. DetSimen

    DetSimen Guest

    А, ну так я ж не разобрался, чокчему. Виноват. Сморозил-с. :)
     
  3. А мне нравится ход ваших мыслей с перегрузкой стандартных вызовов, типа основной код не менялся, а вывод стал иным.
    Например выводим строчку в stdout через puts
    Код (Text):

    #include <stdio.h>

    int main(void) {
       puts("hello word");
    }
     
    Соберем
    Код (Text):
    gcc -o test main.c
    Посмотрим что вышло
    Код (Text):
    ./test
    hello word
    сделаем свою реализацию puts
    Код (Text):

    int __real_puts(const char *s);

    int __wrap_puts(const char *s) {
       __real_puts("call is wrapped");
       return __real_puts(s);
    }
     
    Соберем указав что puts в обертке
    Код (Text):
    gcc -o test main.c override_puts.c -Wl,-wrap,puts
    Посмотрим что вышло
    Код (Text):
    ./test
    call is wrapped
    hello word
    А main то и не знает что его прослушивают :)
     
  4. parovoZZ

    parovoZZ Гуру

    а
    и
    это что за функции? Яндекс молчит.
     
  5. :)))
    ключом -Wl,-wrap,puts
    говорим, что вызов puts из стандартной библиотеки обернут, т.е. когда нужно вызвать puts, то нужно направить в __wrap_puts, а если необходимо вызвать библиотечный puts, то он уже под другим именем __real_puts.
    Это-ж gcc

    Скажите, это, стало быть, любую стенку можно так убрать?
    Вашему изобретению цены нет, гражданин!

    © Михаил Булгаков «Иван Васильевич»
     
  6. parovoZZ

    parovoZZ Гуру

    а что куда направлять задается порядком объявления функций в исходнике?
     
  7. Порядок тут не причем.
    Там где перегрузка реализации библиотечной функции к сигнатуре добавлен префикс __wrap_ (__wrap_puts)
    Чтоб вызвать библиотечный puts знаем что к сигнатуре нужно добавить другой префикс __real_
    поэтому в исходнике и объявлен int __real_puts(const char *s), чтоб при компиляции не получить
    override_puts.c:4:2: warning: implicit declaration of function ‘__real_puts’; did you mean ‘__wrap_puts’? [-Wimplicit-function-declaration]