LINUX.ORG.RU

Заглянуть внутрь бинарника


0

1

Есть у меня проприетарный драйвер. Хочу сделать опенсорс. Причем, судя по всему такой уже есть, но хочу велосипед)

Суть в том, что он обменивается с устройством (UPS) USB HID коммандами.

Кусок strace:

open("/dev/usb/hiddev0", O_RDWR)        = 4                                     
ioctl(4, HIDIOCAPPLICATION or HIDIOCGRDESC, 0) = 8650756                        
ioctl(4, HIDIOCGREPORTINFO, 0xffbaa200) = 0                                     
ioctl(4, HIDIOCGFIELDINFO, 0xffbaa1b0)  = 0                                     
ioctl(4, HIDIOCGUCODE, 0xffbaa1e8)      = 0                                     
ioctl(4, HIDIOCGFIELDINFO, 0xffbaa1b0)  = 0                                     
ioctl(4, HIDIOCGUCODE, 0xffbaa1e8)      = 0                                     
ioctl(4, HIDIOCGFIELDINFO, 0xffbaa1b0)  = 0                                     
ioctl(4, HIDIOCGUCODE, 0xffbaa1e8)      = 0                                     
ioctl(4, HIDIOCGREPORTINFO, 0xffbaa200) = 0

Как просмотреть, что там в памяти для 3-го аргумента?

gdb выдает просто

(gdb) bt
#0  ioctl () at ../sysdeps/unix/syscall-template.S:82
#1  0x08049b5e in check_device_is_ups ()
#2  0x0804a1ef in connect_device ()
#3  0x0804a2d8 in hid_ups_connect ()
#4  0x0804910c in ups_connect ()
#5  0x0804cad2 in ontimer_device_connecting ()
#6  0x0804c022 in invoke_timertasks ()
#7  0x0804c8e6 in main ()

И ещё вопрос, а этот HID-интерфейс для UPS един, или каждая компания стремится сделать свой вариант?

Ответ на: комментарий от yoghurt

> На что и куда?

Просто break ioctl, run

info locals как бе

На frame 0 - no locals. При frame 1 пишет, что no symbol table available. А у ioctl есть какая-нибудь отладочная информация в debian? Может что-то доставить нужно?

different_thing ()
Ответ на: комментарий от different_thing

ioctl це ж системный вызов. Я бы попробовал посмотреть, что суют в ioctl с точки зрения ядра

yoghurt ★★★★★ ()
Ответ на: комментарий от different_thing

>А у ioctl есть какая-нибудь отладочная информация в debian? Может что-то доставить нужно?

Поставить можно, но ioctl реализован в .S файле с использованием cryptic макросов. Я не пытался вникать в то, как они разворачиваются, но не исключено, что при компоновке их в объектный код компилятор/компоновщик вообще не видит прототипа соответствующей функции С.

Murr ★★ ()
Ответ на: комментарий от Murr

Да, а почему edx?

objdump дает вот такое:

 8049b30:	55                   	push   %ebp
 8049b31:	89 e5                	mov    %esp,%ebp
 8049b33:	56                   	push   %esi
 8049b34:	53                   	push   %ebx
 8049b35:	31 db                	xor    %ebx,%ebx
 8049b37:	83 ec 10             	sub    $0x10,%esp
 8049b3a:	8b 75 08             	mov    0x8(%ebp),%esi
 8049b3d:	eb 0b                	jmp    8049b4a <check_device_is_ups+0x1a>
 8049b3f:	90                   	nop
 8049b40:	3d 04 00 84 00       	cmp    $0x840004,%eax
 8049b45:	74 24                	je     8049b6b <check_device_is_ups+0x3b>
 8049b47:	83 c3 01             	add    $0x1,%ebx
 8049b4a:	89 5c 24 08          	mov    %ebx,0x8(%esp)
 8049b4e:	c7 44 24 04 02 48 00 	movl   $0x4802,0x4(%esp)
 8049b55:	00 
 8049b56:	89 34 24             	mov    %esi,(%esp)
 8049b59:	e8 6e ef ff ff       	call   8048acc <ioctl@plt>
 8049b5e:	85 c0                	test   %eax,%eax
 8049b60:	79 de                	jns    8049b40 <check_device_is_ups+0x10>

Не ясно, как он ioctl вызывает. Тут вроде нет такого:

http://en.wikipedia.org/wiki/X86_calling_conventions

Результат, судя по всему, в eax. Мда, по какому-то не тому пути я иду)

different_thing ()
Ответ на: комментарий от different_thing

>Да, а почему edx?

На i386 используется такое соглашение при входе в syscall: eax (syscall number), ebx (arg 1), ecx (arg 2), edx (arg 3) и т.д. У SCO или Intel есть документ, детально регламентирующий это.

Не ясно, как он ioctl вызывает.

runtime linker загружает исполняемый файл и необходимые библиотеки, включая libc. В PLT записываются адреса нужных функций. Ваша программа вызывает ioctl@plt, где произойдет jmp по адресу функции ioctl в libc.

Результат, судя по всему, в eax

Да. Результат вызова неядерной функции будет не в eax, если он имеет вещественный тип или это структура и т.п. Но в общем случае он в eax (и всегда в eax в случае syscall).

Murr ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.