LINUX.ORG.RU

Сообщения farisey

 

Загрузка секций shared library по определённому адресу.

Всем привет!

Суть: знает кто-либо способ как принудить секцию .data раздеяемой библиотеки всегда грузиться по одному заранее определённому виртуальному адресу?

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

Это скорее всего как минимум arch-dependent. Но возможно ли в принципе?

PS. Есть, конечно, способ - не использовать в программах тот функционал so, который ссылается на эти неудобные в своей неявной статичности переменные. Но это надо код лопатить. А завернув .data в один адрес, можно такой хитро#опостью вообще ничего не менять.

Tnx!

 

farisey ()

Хитрая IP-фильтрация по содержимому

Задача:
Отфильтровать IP/UDP пакеты (тривиально) такие, что (самый цимес) в payload UDP пакета самый первый байт имеет старший бит равный 1. Ну или = 0x80/0x80, если применить схему база/маска.
Вот как бы такое отловить?

Первая мясль была iptables --hex-string, но тут нельзя биты фильтровать. Вторая tc filter, но документация подобного рода сильно эзотерична, а примеры скудны и разрозненны.

Как добыть UDP payload в iptables/iproute2 у меня так и не получилось понять. В принципе можно упростить, посчитав, что payload начинается с оффсетом 42 (=0x2a) от заголовка пакета (MAC). Но заделать битовую маску - не осилилось:(

Прошу помощи.

Спасибо.

farisey ()

Аппаратное декодирование на AMD Radeon

Вопрос следующего свойства.

Можно ли использовать сабж (xvba) за рамками иксов? Например, через mplayer/vlc играть во фреймбуфер. Или акселерация ТОЛЬКО через X-сервер? Никакой directfb не прокатит?

Сам я почти уверен, что это X-only, но хочется подтверждений более компетентных пассажиров.

Спасибо.

PS. Хотя время неудачное для расспросов - конец тяпницы:(

farisey ()

ixp422 mm corruption

Вторая недели бесполезной возни с железкой.

Сабж. одноплатка EM-436B v2.1

CPU: XScale-IXP42x Family rev 2 (v5b), 266МГц (на корпусе нацарапано «PRIXP422ABB»)
RAM: 4x256Мбит = 128мегабайт (самсунги K4S561632H-UC75)
PCI-контроллер Promise PDC20275, на который навешан CompactFlash и всякий прочий эзернет.

Ничего вроде бы особенного, вот только объявились проблемы со старосборным ядром 2.6.20, без проблем работающим на ixp425 (ланнеровская железка FW-3600 A/B). Аппаратная разница по идее не настолько велика, чтоб всё дошло до несовместимости, но стойкое (100%) появление «Unable to handle kernel NULL pointer dereference at virtual address такой-то» при попытке ядра распаковать initrd приводило в уныние.

Дабы не гадать на тему бажности старого ядра и собственной косорукости при его давней сборке, я быстренько взял имеющееся под рукой 2.6.35.7, собрал его со страшной силой и максимально дефолтным конфигом. Ну и затеял грузить его с простейшим initrd, размером менее мегабайта, тоже быстро слепленным в тестовых целях.

Наконец, удалось получить шелл. Но радость была преждевременна. При самый осторожных движениях и безобидных командах валились ядерные ошибки при доступе памяти. Вызов ps мог повалить ядро. Или cat /proc/что-то_там. Ну а dd if=/dev/zero of=/tmp/file bs=1M count=16 убивало девайс стопроцентно (/tmp - это tmpfs).

Причём всегда в бектрейсе фигурировали функции kmem_cache_(alloc|free) и прочие из той же оперы. Принципиально ошибки в логе были теми же самыми, что и при запуске 2.6.20, собранного торвальдс знает когда.

Причём на ixp425(FW-3600) и старая (что давно отлажено) и новые (тестовые) сборки запускаются и работают без каких-либо проблем. Правда, на ixp425 имеем 64M рамы, а здесь на ixp422 аж 128. Причём redboot определяет 256, так что ядру приходится указывать реальный размер. Впрочем, с ограничениями по размеру я как только не экспериментировал - принципиальной разницы не наблюдается. Только DMA на CF то работает, то нет.

Вариант с запуском сборки наисвежайшего 2.6.37.2 также ничего не изменил. Разве только что вместо NULL pointer валит что-нибудь вроде

# dd if=/dev/zero of=/tmp/0 bs=1M count=16
Kernel panic - not syncing: Attempted to kill init!
[<c0032e94>] (unwind_backtrace+0x0/0xf0) from [<c02a27b4>] (panic+0x58/0x17c)
[<c02a27b4>] (panic+0x58/0x17c) from [<c0041f0c>] (do_exit+0x6c/0x60c)
[<c0041f0c>] (do_exit+0x6c/0x60c) from [<c0042538>] (do_group_exit+0x8c/0xc0)
[<c0042538>] (do_group_exit+0x8c/0xc0) from [<c004c2fc>] (get_signal_to_deliver+0x2d8/0x310)
[<c004c2fc>] (get_signal_to_deliver+0x2d8/0x310) from [<c002fd80>] (do_signal+0x50/0x5a8)
[<c002fd80>] (do_signal+0x50/0x5a8) from [<c00302f0>] (do_notify_resume+0x18/0x4c)
[<c00302f0>] (do_notify_resume+0x18/0x4c) from [<c002d694>] (work_pending+0x24/0x28)

и благополучно переходит в состояние агонии: не даёт запустить апплеты бизибокса (permission denied), а прямой вызов вроде /bin/busybox ls выдаёт какоё-нибудь sigsegv.

В общем налицо неверная работа ядра с памятью. Причём на другой похожей одноплатке (v2.0, а не 2.1) проблемы полностью аналогичны.

Изгалялся я всячески, крутил и вертел параметры, понавключал дебагги везде и всюду. Причём ядро то успевало ругнуться дебаггом аллокатора на «перезаписывание паддинга» или «нарушение Redzone», то благополучно валилось в exception со своими проклятыми пойнтерами.

Пример бэктрейса приведу.

Уже немного отчаялся и помышляю писать куда-нибудь в Спортлото кернелтрап, но сначала спрошу здесь: есть у кого мысли какие-нибудь?

Грешить на неверную инициализцию железа редбутом? Так ядро всё равно всё с нуля делает.
Что я криво что-то собрал? Перепробованы 3 версии ядра с разными конфигами. Не работает на ixp422, но работает на 425.
Сколько было соображений - все перепробовал - толку нет.

I need help!

farisey ()

Порядок загрузки built-in модулей ядра.

Привет всем.

Имеем: 2 модуля вкомпиленных в ядро. Каких-либо зависимостей по символам нет. Надо заставить один инициализироваться раньше другого.
Порядок в Makefile'е менял(вернее, порядок субдир - сабжи находятся в разных), гуглил. Не помогает.

Кажется, что это нечто простое (из вертящихся в уме), но как-то пока не осилил.

Ай нид хелп!
Спасибо.

farisey ()

Упаковка структур

В Гугле и в Поиске ЛОРа ничего подходящего не нашлось.

Суть вопроса. Возьмём для отвлечённого примера netinet/icmp6.h и заявленную там

struct icmp6_hdr                                                                                                                                                                   
  {                                                                                                                                                                                
    uint8_t     icmp6_type;   /* type field */                                                                                                                                     
    uint8_t     icmp6_code;   /* code field */                                                                                                                                     
    uint16_t    icmp6_cksum;  /* checksum field */                                                                                                                                 
    union                                                                                                                                                                          
      {                                                                                                                                                                            
        uint32_t  icmp6_un_data32[1]; /* type-specific field */                                                                                                                    
        uint16_t  icmp6_un_data16[2]; /* type-specific field */                                                                                                                    
        uint8_t   icmp6_un_data8[4];  /* type-specific field */                                                                                                                    
      } icmp6_dataun;                                                                                                                                                              
  };
Структура, как мы видим, неупакованная.

Вопрос: можно ли (и как, если да)

1. Объявить переменную типа «упакованная struct icmp6_hdr»

2. Объявить указатель на «упакованную struct icmp6_hdr»

3. Привести указатель (void*, например) к типу «указатель на упакованную struct icmp6_hdr».

?

Вариант «заяви и пользуй свою структуру foo, которая есть копипаста от субжевой с припиской __attribute__((packed)) в конце» не предлагать. Потому что, сейчас так в общем-то и сделано:))). Просто не нравится очень такая... корявость чтоль. Хотя если нет других вариантов, то придётся оставить так.

farisey ()

cmake: shared library: -soname -fPIC

Честно потолкался в документации cmake, а также поиске лора. Не нашлось:(

Суть.

Используя add_library от cmake получаем, что система сборки использует
а) -Wl,-soname,libfoo.so -o libfoo.so
б) -fPIC

Никак не могу понять как штатно рулить параметрами компиляции/линковки для so'шек в данных случаях.
а) как указать свои soname ?
б) как, например, заменить -fPIC на -fpic ? Есть add_definitions, есть remove_defenitions. А вот replace_default что-то не обнаружил.

Есть всякие COMPILE_DEFINITIONS, но хотелось бы именно «заменить вот такую опцию, на вот такую» без глобальных вмешиваний в cmake'овые дефолты.

Спасибо.

farisey ()

Xpra 0.0.6 - «screen» for X

Никто субж не пользовал? В дебах нету, руками приводится в боевое состояние легко. Всё вроде бы фунциклирен, иксовые приложения работают, вот только русский текст ввести не могу - гуй молчит как подавился, только в логе сервера вот такие вещи появляются:

Unhandled error while processing packet from peer
Traceback (most recent call last):
File "install/lib/python/xpra/protocol.py", line 126, in _consume_packet
File "install/lib/python/xpra/server.py", line 624, in process_packet
File "install/lib/python/xpra/server.py", line 563, in _process_key_action
File "install/lib/python/xpra/server.py", line 403, in _keycode
TypeError: 'NoneType' object is unsubscriptable



А через некоторое время и аглицкий текст перестаёт вводиться.
Хотя копипастом всё, что угодно, вставить можно.



PS. NX,VNC и всё такое не предлагать. Нужно несколько X-приложений "расшарить". Не хочется из пушки по воробьям.

farisey ()

apt-proxy on Gentoo

Всем привет. Неожианный вопрос.

Известен ли "правильный" способ поднять дебианову проксю (apt-proxy) на компе с гентой?

Заранее спасибо....или "ждём ебилдов" :))))

>>>

farisey ()

Количество открытых дескрипторов

Привет!

Как узнать кол-во открытых дескрипторов процесса средствами libc?

Как менять OPEN_MAX - знаю, а как выяснить сколько затрачено - хз:(

man getrusage разочаровал, google (что редко!) не помог.

PS ls /proc/PID/fd/ сотоварищи не предлагать!

Спасибо!

>>>

farisey ()

shared library. Лыжи не едут

Приветствую!

Ситуация.

Есть демон, использующий самописную библу(всё не моё).

Есть 2 сборки:

а) демон статически слинкован с оной библиотекой (некислый такой по размеру)

б) динамическая линковка (мааахонький бинарь, некислая библиотека)

Запускаются 100 экземпляров статической проги, замеряется расход памяти. Потом 100 экземпляров динамически слинкованной... Расход - одинаковый! Разница - доли процента(это уже стороннее, имхо). Я не парился с RSS,Vm и прочим, а просто сделал free до запуска и после.

Вопросы:

1. Хрен с ними с данными..а разделение кода где?

2. Собрано с -fPIC(точно знаю). Можно ли ухитриться было собрать так, чтоб фактического разделения памяти не было?

3. Как посмотреть по файлу .so размеры сегментов... никак не найду:(..

Заранее спасибо!

PS За полезные ссылки буду очень благодарен.

>>>

farisey ()

uart:XScale

Всем привет. Вопрос. нормально ли, что на пустом (неподключённом) сериале выставлено столько много? RTS|DTR|DSR|CD|RI (если верить /proc/tty/driver/serial) uart:XScale как бы не извращался с управлением непонятный мне мусор DSR|CD|RI __всегда__ в единице.

Мне нужно отлавливать изменения DSR. Если пир меняет этот сигнал, то проблемный сериал этого не замечает. У него DSR (равно как и CD|RI) всегда = 1, поэтому ioctl(tty_fd,TIOCMIWAIT,TIOCM_DSR) висит безвылазно.

Как его отключить без перепаек всяких?

Спасибо.

>>>

farisey ()

iptables-dev

Всем привет!

Никто не сталкивался с работой с библиотеками iptables в C?

Мне нужно (не скриптом, а в сях!) извлекать счётчики байт, прошедших через правило в некотором чейне. Конкретно: chain - PRE1, правило - первое в чейне.

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

Спасибо!!

farisey ()

Doxygen(errno)

Честно гуглил и смотрел FAQ, наколлекционировал закладок на странички.

Впервые за много лет кодирования начал писать doxygen-документацию в программе, а не писать документацию в отдельной доке. Худо-бедно ковыряюсь, но!.. при документировании функции сразу наткнулся на проблему. Как выделить секцию с описанием кодов ошибок (errno)? Типа как "Errors" в манах. Никак ни тег не найду ни пример.

Спасибо.

PS Ежели ссылки есть, с радостью приму в дар.

farisey ()

Проверка области памяти на доступ

Привет всем.

В ядре есть замечательно полезная функция access_ok(type,addr,size), проверяющая участок юзерспейсной памяти [addr; addr+size-1] на доступ, описываемый параметром type (чтение или чтение/запись).

Но это в ядре. Есть ли подобное средство в юзерспейсе... проще говоря, в libc? Ну или приемлемый костыль(не слишком сучковатый)?

Спасибо.

farisey ()

dlfcn

Добрый вечер всем!

Не раз работал с функциями семейства `man dlopen` и только сейчас наткнулся на такое препятствие.


Традиционно dlsym вызывается по отношению к подгруженной библиотеке (см. хрестоматийный пример с косинусом). Всю жизнь только так и использовал. А наоборот? Вот загрузил я библиотку(dlopen), нашёл функцию(dlsym), запустил её. Функция эта, в свою очередь, пытается найти символ в основной программе(грубо говоря, в main.c). Может и по-дурацки это, но так досталось в наследство, а бэк-компатибилити соблюдать надо.

Прочитав в мане dlopen строки

"If filename is a NULL pointer, then the returned handle is for the main program."

решил, что вот он способ из библиотеки обратиться к основной программе, и с лёгким сердцем стал искать нужный символ таким образом..
Сначала dlopen(NULL,RTLD_LAZY). Хендлер нормально возвращается. Обрадовался, что всё идёт как нужно. НО! При попытке dlsym необходимого символа из main.c, получаю сообщение про unresolved, хотя символ этот точно есть.

Дебаг с применением методов вроде

#define _GNU_SOURCE

дал следующий результат. dlopen(NULL,...) возвращает хендлер для "/lib64/ld-linux-x86-64.so.2"(симлинк на /lib/ld-2.5.so), где, понятное дело, никаких нужных мне символов нет.

Не подскажете, что делать? Заранее благодарен.

PS Если вдруг требуется
$ cat maps
00400000-00401000 r-xp 00000000 08:12 9618567 /tmp/dlfcn/main
00601000-00602000 rw-p 00001000 08:12 9618567 /tmp/dlfcn/main
00602000-00623000 rw-p 00602000 00:00 0 [heap]
2b453f5f1000-2b453f60d000 r-xp 00000000 08:03 271195 /lib/ld-2.5.so
2b453f60d000-2b453f610000 rw-p 2b453f60d000 00:00 0
2b453f80c000-2b453f80e000 rw-p 0001b000 08:03 271195 /lib/ld-2.5.so
2b453f80e000-2b453f811000 r-xp 00000000 08:12 9093861 /tmp/dlfcn/lib.so
2b454058c000-2b454058d000 rw-p 2b454058c000 00:00 0
7fff6b4a4000-7fff6b4b9000 rw-p 7fff6b4a4000 00:00 0 [stack]
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0 [vdso]

farisey ()

ttyS

Привет всем!

Есть ли тулза, которая для сериального порта /dev/ttyS%d отслеживает всяческие события(типа дрыгания ногами) и в читабельном виде предлагает интересующимся?

Спасибо!

farisey ()

select & Co

Всем привет!

Кратко. Есть клиент-сервер. Клиенты коннектяцца и не посылают никаких данных, а только получают. Сервер имеет туеву хучу клиентов, некислые требования к производительности и весьма ограниченные системные ресурсы.

Все клиенты вешются в селект, один select! Необходимо игнорировать данные от клиентов, их не должно быть. Чтобы селект не вывыливался постоянно бестолку. Для этого можно просто не включать клиентские дескрипторы в первый набор селекта(на чтение). Но как тогда отлавливать дисконнект(0 байт при чтении)? Решил впервые поюзать 3й набор (исключения), и с прискорбием обнаружил, что дисконнект не входит в исключительные ситуации сокетов.

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

Спасибо.

PS. Сильно ломать структуру программы нельзя.

farisey ()

tc (htb shaper)

Сразу признаю, что лучшим ответом на мой вопрос будет "кури маны, доки, гуглы". Согласен, но голова уже не работает.

Ситуация:
Контора из 2х офисов(через стенку). Компы все в локалке (ну, например, 192.168.50/24). Известны какие IPшники в каком офисе. Есть инет-шлюз.

Задача:
Треба на шлюзе настроить htb-шейпинг, чтобы на один офис было ограничение 2 Мбит/сек, а на другой 1 Мбит/сек. Причём, на каждого юзера из первого офиса не более 0.5 Мбит/сек, а из второго 0.1 Мбит/сек.

Люди! Плиз! Дайте последовательность команд (tc qdisc,class,filter и т.д.).. Я чота _так_ туплю, что сам удивляюсь....ну никак!
Спасибо!

farisey ()

Дамп в libpcap

Никак не осилю..
Прога капчит ифейс "any" с неким фильтром и валит дамп в stdout.
Структура аналогична сырцам tcpdump'а:

/*подготовка*/
pcap_open_live
pcap_dump_fopen(..,stdout)
pcap_compile
pcap_setfilter
/*дамп*/
while (1)
{
...
pcap_loop(....,handler,....)
...
}

где хендлер просто вызывает pcap_dump(user,header,cap_data).

Всё работает и было бы просто отлично, но!..полученный дамп не открывается wireshark'ом (грит wrong format).

Даже на глаз видно, что в моём дампе проскакивают хтмльные теги и прочий понятный навскидку мусор. А дамп tcpdump'а (понятный wireshark'у) такого не содержит - сплошное (или почти сплошное) binary.

Я думал, что забыл какой-то флаг, вызывающий форматирование дампа в какой-то pcap-формат, но в сырцах tcpdump'а не нашёл ничего подобного.

Куда курить? Может кто сталкивался....помогите, плиз!

farisey ()

RSS подписка на новые темы