Связывание разделяемой библиотеки с ядром Linux

Похоже, вы обнаружили ошибку в wget . Я пробовал несколько итераций команд wget , пытаясь выяснить причину. Моя первая мысль заключалась в том, что регулярное выражение заставляет wget рассматривать его как два несвязанных набора, а не связывать их.Я разработал версию без регулярного выражения, чтобы получить, по-видимому, те же файлы, преобразовав параметры в длинную форму и сделав их дискретными (--mirror - составное) и добавив в файл журнала и сохранив оригиналы:

wget --recursive --convert-links --backup-converted --page-requisites --no-host-directories --level=inf --adjust-extension --include /javase/tutorial,/javase/tutorialJWS,/javase/8/docs/api https://docs.oracle.com/javase/8/index.html 2>&1 | tee wget.log

Grepping the файлы для сравнения Я обнаружил, что каждая ссылка , не преобразованная, была абсолютной ссылкой в ​​исходном источнике. Все первоначально относительные ссылки оставались относительными (не преобразовывались на самом деле). В выводе wget утверждается, что эти файлы «преобразованы», но, похоже, были затронуты только теги без привязки.

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

Для размера вашего проекта перспектива преобразования ссылок в относительные кажется устрашающей даже при наличии сценария. Я наткнулся на сообщение PerlMonk Изменить абсолютные ссылки на относительные в файлах HTML с помощью сценария Perl, который нацелен на решение проблемы, с которой вы сейчас столкнулись.

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

Тем временем, я полагаю, у вас есть привилегия сообщить об ошибке на wget . Для справки моя версия:

$ wget --version
GNU Wget 1.14 built on linux-gnu.

+digest +https +ipv6 +iri +large-file +nls +ntlm +opie +ssl/openssl 

Wgetrc: 
    /etc/wgetrc (system)
Locale: /usr/share/locale 
Compile: gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC="/etc/wgetrc" 
    -DLOCALEDIR="/usr/share/locale" -I. -I../lib -I../lib 
    -fmessage-length=0 -grecord-gcc-switches -O2 -Wall 
    -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables 
    -fasynchronous-unwind-tables -g 
Link: gcc -fmessage-length=0 -grecord-gcc-switches -O2 -Wall 
    -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables 
    -fasynchronous-unwind-tables -g -lproxy /usr/lib64/libssl.so 
    /usr/lib64/libcrypto.so /usr/lib64/libz.so -ldl -lz -lz -lidn 
    ftp-opie.o openssl.o http-ntlm.o ../lib/libgnu.a 

1
05.08.2016, 04:57
1 ответ

Вы практически не можете этого сделать (связать разделяемую библиотеку с ядром или каким-либо модулем ядра). Ядро концептуально представляет собой автономную программу ( поэтому не знает о низкоуровневых стандартных функциях C, таких как malloc или fprintf , которые, скорее всего, будет использовать ваша общая библиотека). Модули ядра (файлы * .ko ) специально созданы и загружаются с помощью специального кода ядра.

Кроме того, код пользователя (включая библиотеки) основан на системных вызовах (перечисленных в syscalls (2) ), которые недоступны в коде ядра (поскольку ядро предоставляет системные вызовы для процессов , работающих в пользовательском режиме через определенное оборудование).

Вы можете подумать о том, чтобы вспомогательная программа пользовательского уровня взаимодействовала с ядром (то есть с вашим модулем ядра), например используя netlink (7) . Возможно, посмотрите также systemd .

Вам, вероятно, следует прочитать больше об операционных системах и прочитать Расширенное программирование Linux , чтобы понять аспекты, связанные с пользовательской средой.

Кстати, как показывает практика, вы должны ограничить количество кода ядра, добавляемого в систему (и предпочитать работу на уровне пользователя).

4
27.01.2020, 23:19

Теги

Похожие вопросы