Можно-ли перенаправить вывод printf, подсунув ему свою функцию типа putc(). Вариант с sprintf и последующим выводом полученной строки известен, но похож на костыль.
Не по пьяни. Есть железка вообще без ОС. У нее есть ком-порт. Нужно вывод libc-шного printf-а перенаправить в этот ком. Для него есть функция __putc() которая все выводит. Как ее подсунуть printf-у?
Указатель на самостоятельно инициализированную структуру FILE. GLIBC пока нет возможности посмотреть, я гляжу в CYGWIN-е, так вот, в нем в структуре FILE есть пара интересных указателей на функции _read и _write - это соотвественно указатели на функции низкоуровнего (т.е. в нашем случае небуферизированного) чтения/записи. Вопрос в том, есть ли поддержка в вашей embedded библиотеке функций типа fprintf, fopen, fread и т.д.
Ну и на худой конец, если уже библиотека этого не позволяет, и лень связываться с кривым методом "sprintf", можно попробовать самостоятельно определить функцию printf, благо исходников её реализации полно.
а как ты сможешь в принципе запихнуть туда glibc? Имхо, проще взять исходники printf и их немного переделать. А что за железка, если не секрет? Потом посмотри, как это сделано в avrlib. К тому же уверен на 99% что есть ограничение по объёму кода, так что в любом случае придёться делать свою реализацию printf.
Переписать системный вызов write в libc, чтобы он писал по нужному адресу, и из printf вызывать этот модифицированный вызов. Как взаимодействует libc с железом? Есть же прослойка какая-нить?
>Можно-ли перенаправить вывод printf, подсунув ему свою функцию типа putc(). Вариант с sprintf и последующим выводом полученной строки известен, но похож на костыль.
Можно:
1) перегрузить printf() через LD_PRELOAD
2) таки разобраться кто на ком стоял и сделать всё по уму.
PS: тот же putc() принимает в качестве аргумента поток FILE* ... или там какой то особо извращённый putc() ?