Вечер добрый. Есть бинарник (ELF 32 i386), который падает сразу после запуска. Пишет Sigmentation Fault. Исходников нет. Отладочной информации тоже нет. Знаю, что в другой системе (правда не Linux) этот бинарник работает отлично. Т.е. запустить его все-таки можно. Запустил его в gdb. Сделал run. Получил Seg Fault. Сделал backtrace. В результате что-то типа: #0 0x00001234 ?? () #1 0x00002234 ?? () #2 0x00003234 ?? () #3 0x00004234 ?? () #4 0x00005234 ?? () ... Опишите, п-та, как такие вещи вообще можно отладить? Никогда под никсы этим не занимался... Привык к Olly)) Кто знает - хоть примерно укажите, куда копать. Буду очень благодарен. И еще. gdb сможет отладить COFF??
Span мм.. если правильно понял... то граф оболочку для gdb загрузи.. DDD Seg Fault... ищи ошибку в esi и edi ... вобщем, видимо где-то в параметре вместо какого-то адреса (к примеру esi ) заносится непосредственное значение... .. найти подобную ошибку в gdb достаточно просто.
Span, gdb работает и без символов. Читай доку. up, down, print, info registers, disassemble. В инете море доков, tutorials.
Это не Линукс, а Юникс приложение скорее всего. По крайней мере, если на фасме сделать бинарник по правилам юникс и пытаться запустить в Линуксе, будет именно это сообщение.
(gdb) print $eip $1 = (void (*)()) 0xebc3e6 (gdb) show mem - etogo net voobshe v gdb. Pohuzhego tozhe ne nashel. $ readelf -a ./my_program A vot tut ochen mnogo vsego interesnogo: Код (Text): ELF Header: Magic: 7f 33 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x804b690 Start of program headers: 52 (bytes into file) Start of section headers: 1472884 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 6 Size of section headers: 40 (bytes) Number of section headers: 22 Section header string table index: 20 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 080480f4 0000f4 000013 00 A 0 0 1 [ 2] .hash HASH 08048108 000108 00089c 04 A 3 0 4 [ 3] .dynsym DYNSYM 080489a4 0009a4 0011e0 10 A 4 1 4 [ 4] .dynstr STRTAB 08049b84 001b84 000a39 00 A 0 0 1 [ 5] .rel.got REL 0804a5c0 0025c0 000008 08 A 3 15 4 [ 6] .rel.bss REL 0804a5c8 0025c8 000018 08 A 3 16 4 [ 7] .rel.plt REL 0804a5e0 0025e0 000588 08 A 3 8 4 [ 8] .plt PROGBITS 0804ab68 002b68 000b20 04 AX 0 0 4 [ 9] .text PROGBITS 0804b690 003690 0ff9e8 00 AX 0 0 16 [10] .init PROGBITS 0814b078 103078 000004 00 AX 0 0 4 [11] .fini PROGBITS 0814b07c 10307c 000004 00 AX 0 0 4 [12] .dynamic DYNAMIC 0814c080 103080 0000b0 08 WA 4 0 4 [13] .data PROGBITS 0814c130 103130 01bd28 00 WA 0 0 8 [14] .data1 PROGBITS 08167e58 11ee58 007f6b 00 WA 0 0 4 [15] .got PROGBITS 0816fdc4 126dc4 000508 04 WA 0 0 4 [16] .bss NOBITS 081702cc 1272cc 006974 00 WA 0 0 4 [17] .note NOTE 00000000 1272cc 00001c 00 0 0 1 [18] .symtab SYMTAB 00000000 1272e8 015af0 10 19 2287 4 [19] .strtab STRTAB 00000000 13cdd8 00e996 00 0 0 1 [20] .shstrtab STRTAB 00000000 14b76e 00009a 00 0 0 1 [21] .comment PROGBITS 00000000 14b808 01c16c 00 0 0 4 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) There are no section groups in this file. Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x00000000 0x000c0 0x000c0 R E 0 INTERP 0x0000f4 0x00000000 0x00000000 0x00013 0x00000 R 0 [Requesting program interpreter: /usr/lib/libc.so.1] LOAD 0x000034 0x08048034 0x00000000 0x10304c 0x10304c R E 0x1000 LOAD 0x103080 0x0814c080 0x00000000 0x2424c 0x2abc0 RWE 0x1000 DYNAMIC 0x103080 0x0814c080 0x00000000 0x000b0 0x00000 RWE 0 NOTE 0x1272cc 0x00000000 0x00000000 0x0001c 0x00000 0 Section to Segment mapping: Segment Sections... 00 01 02 .interp .hash .dynsym .dynstr .rel.got .rel.bss .rel.plt .plt .text .init .fini 03 .dynamic .data .data1 .got .bss 04 05 .note Dynamic section at offset 0x103080 contains 22 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [/lib/libprot.so.1] 0x00000001 (NEEDED) Shared library: [/usr/lib/libsocket.so.1] 0x00000001 (NEEDED) Shared library: [/usr/lib/libsocket.so.1] 0x00000001 (NEEDED) Shared library: [libnsl.so] 0x00000001 (NEEDED) Shared library: [/lib/libprot.so.1] 0x00000001 (NEEDED) Shared library: [/usr/lib/libc.so.1] program interpreter 0x0000000c (INIT) 0x814b078 0x0000000d (FINI) 0x814b07c 0x00000004 (HASH) 0x8048108 0x00000005 (STRTAB) 0x8049b84 0x00000006 (SYMTAB) 0x80489a4 0x0000000a (STRSZ) 2617 (bytes) 0x0000000b (SYMENT) 16 (bytes) 0x00000015 (DEBUG) 0x0 0x00000003 (PLTGOT) 0x816fdc4 0x00000002 (PLTRELSZ) 1416 (bytes) 0x00000014 (PLTREL) REL 0x00000017 (JMPREL) 0x804a5e0 0x00000011 (REL) 0x804a5c0 0x00000012 (RELSZ) 32 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x00000000 (NULL) 0x0 Relocation section '.rel.got' at offset 0x25c0 contains 1 entries: ... ... ... Sorry za translit Добавил: Падает приложение, похоже, в модуле libc.so.1 У меня в Linux этой либы(libc.so.1) вообще не было. Была только libc.so.6 (GNU C lib v 2.5) А libc.so.1 я взял из Юникса, где мое приложение отлично работает. Я правильно сделал? )) Или надо найти Lib.so.1 под мой linux?
cat /proc/<pid>/maps libc.so.1 у тебя является загрузчиком приложения, коли ты взял его из другой ОС не удивительно, что оно падает. Если например поправить в бинарнике интерпритатор на /lib/ld-linux.so.2 и посмотреть что будет.
Спасибо за совет. Поменял имя загрузчика на стандартный для моей ОС (ld-linux.so.2). Теперь readelf выводит: Код (Text): Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x00000000 0x000c0 0x000c0 R E 0 INTERP 0x0000f4 0x00000000 0x00000000 0x00013 0x00000 R 0 [Requesting program interpreter: [b]/lib/ld-linux.so.2[/b]] LOAD 0x000034 0x08048034 0x00000000 0x10304c 0x10304c R E 0x1000 Но прога всеравно падает. Теперь уже в ld-linux.so.2 (ld-2.5.so в моем дистре). Приложил скириншот дебаггера (EDB). Я попробовал за NOPить эту проверку, приложение завершилось само, с сообщением об ошибке: symbol lookup error. Что это значит? Как лечить? Вопрос остается: как запустить приложение, написанное под Юникс (SCO), из под Linux? Это для меня важный вопрос, так что буду рад любым советам. Дайте, чтоль, ключевые слова, чтобы почитать про ABI, interpreter, ELF, etc. Thx.
Никак, никакое шамаство тебе не поможет. Скомпилируй приложение для линукс. Если не сорцов - заведи себе виртуальную машину, там и запускай.
Нет исходных кодов. Запускать на ВМ нет смысла - приложение работает с БД через разделяемую память. БД двигать на ВМ нет возможности... Странно все это, я ведь запустил на Линуксе несколько бинарников, которые крутились на SСO. Правда там формат был coff, а не elf. Остался один бинарник в формате elf32-386. Как раз о нем речь и идет. Насколько я понимаю - проблема в том, что он использует библиотеки от SCO: Код (Text): /usr/lib/libsocket.so.1 libnsl.so /lib/libprot.so.1 /usr/lib/libc.so.1 а когда я ему подсовываю такие-же, но из линукса - он в них что-то не находит (в моем случае - символ errno) Может есть смысл дизассемблировать приложение, поправить что нужно, а затем собрать заново? Чем?
Судя по скрину падает в strcmp, rtld пытается сравнить строку с чем-то. Посмотри исходники glibc, что делает и в каком месте валится. полный readelf -a для основного бинаря и для библиотек в студию естественно архивом Что бы запустить бинарник в другой системе надо: 1) что бы его корректно загрузил rtld 2) отрезолвил все символы 3) символы указывали на работающие библиотеки 4) библиотеки взять из старой системы или написать заглушки 5) если приложения напрямую юзает системные вызовы (что врят ли, но все может быть), написать патчик для ядра который будет предоставлять для процесса этот механизм системных вызовов и транслировать в системные вызовы linux. з.ы. перенесите тему в UNIX
Да, очень похоже на то. Вылет происходит, когда сравниваются 2 строки. Первая - название подключаемой библиотеки, вторая - нулевой указатель. Вызывается ф-я для каждой библиотеки. Только этот вылет происходит, когда я приложению подсовываю "родной" загрузчик из моей ОС (ld-linux.so.2). Если же я оставляю interpreter'ом в приложухе lib.so.1, который скопировал из SCO - вылет происходит на callf "вникуда". Ок! Скоро скину. Спасибо. Я так понимаю, что symbol lookup error - это как раз невыполненное второе условие?
Сделал что хотел. Помогло http://sourceforge.net/projects/linux-abi Кому интересно, описываю: Перенес все библиотеки, которые использовало приложение из старой ОС (SCO). Приложение вылетало на lcall $7 0. Я так понял, что это передача управления в ядро в SCO. Линукс такие вещи воспринимает буквально и вылетает с Seg Fault. Установил патч. Пометил свой этот ELF файл утилитой из этого патча (COFF работал и так). Установил утройство /dev/socksys 30 0. Все заработало.