LINUX.ORG.RU

Явный и неявный вызов ld-linux.so.2.... Поможите советом, плииииз!


0

0

Ситуация следующая. У меня есть некий екзешник, в котором что-то не так
с внутренней структурой. На Red Hat 8, 9 он работает отлично.
На Red Hat 7.2 же - не работает. При запуске моментально segfault.
Но! Если я его запускаю так: /lib/ld-linux.so.2 ./myproga - все отлично
работает.

КАК ОТЛАЖИВАТЬ такую хрень? А? Под gdb:

Program received signal SIGSEGV, Segmentation fault.
0x4000bd35 in ?? ()
(gdb) bt
#0 0x4000bd35 in ?? ()
#1 0x40002ac5 in ?? ()
#2 0x40010007 in ?? ()
#3 0x4000240f in ?? ()
#4 0x40002203 in ?? ()
(gdb)

Ну что тут можно сделать? Если сделать gdb --args /lib/ld-linux.so.2 ./myproga - все работает.

Умираю, поможите!



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

Вот:

ELF Header:
  Magic:   7f 45 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:               0x8049000
  Start of program headers:          52 (bytes into file)
  Start of section headers:          57344 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         18
  Size of section headers:           40 (bytes)
  Number of section headers:         17
  Section header string table index: 16

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        08048274 000274 000013 00   A  0   0  1
  [ 2] .text             PROGBITS        08049000 001000 000008 00  AX  0   0 4096
  [ 3] .bss              NOBITS          0804a000 002000 000000 00  WA  0   0 4096
  [ 4] .got              PROGBITS        0804b000 002000 00000c 00  WA  0   0 4096
  [ 5] .plt              PROGBITS        0804c000 003000 000010 00  AX  0   0 4096
  [ 6] .rel.plt          REL             0804d000 004000 000000 08   A 11   5 4096
  [ 7] .rel.dyn          REL             0804d000 004000 000008 08   A 11   4 4096
  [ 8] .gnu.version      VERSYM          0804e000 005000 000006 02   A  0   0 4096
  [ 9] .gnu.version_r    VERNEED         0804f000 006000 000020 00   A 12   1 4096
  [10] .hash             HASH            08050000 007000 000018 00   A 11   0 4096
  [11] .dynsym           DYNSYM          08051000 008000 000030 10   A 12   1 4096
  [12] .dynstr           STRTAB          08052000 009000 000022 00   A  0   0 4096
  [13] .dynamic          DYNAMIC         08053000 00a000 000090 00  WA 12   0 4096
  [14] .strtab           STRTAB          08054000 00b000 000027 00   A  0   0 4096
  [15] .symtab           SYMTAB          08055000 00c000 000040 10   A 14   1 4096
  [16] .shstrtab         STRTAB          00000000 00d000 000085 00      0   0  1
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)

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x00240 0x00240 R   0x4
  INTERP         0x000274 0x08048274 0x08048274 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x00287 0x01000 R   0x1000
  LOAD           0x001000 0x08049000 0x08049000 0x00008 0x01000 R E 0x1000
  LOAD           0x002000 0x0804a000 0x0804a000 0x00000 0x01000 RW  0x1000
  LOAD           0x002000 0x0804b000 0x0804b000 0x0000c 0x01000 RW  0x1000
  LOAD           0x003000 0x0804c000 0x0804c000 0x00010 0x01000 R E 0x1000
  LOAD           0x004000 0x0804d000 0x0804d000 0x00000 0x00000 R   0x1000
  LOAD           0x004000 0x0804d000 0x0804d000 0x00008 0x01000 R   0x1000
  LOAD           0x005000 0x0804e000 0x0804e000 0x00006 0x01000 R   0x1000
  LOAD           0x006000 0x0804f000 0x0804f000 0x00020 0x01000 R   0x1000
  LOAD           0x007000 0x08050000 0x08050000 0x00018 0x01000 R   0x1000
  LOAD           0x008000 0x08051000 0x08051000 0x00030 0x01000 R   0x1000
  LOAD           0x009000 0x08052000 0x08052000 0x00022 0x01000 R   0x1000
  LOAD           0x00a000 0x08053000 0x08053000 0x00090 0x01000 RW  0x1000
  LOAD           0x00b000 0x08054000 0x08054000 0x00027 0x01000 R   0x1000
  LOAD           0x00c000 0x08055000 0x08055000 0x00040 0x01000 R   0x1000
  DYNAMIC        0x00a000 0x08053000 0x08053000 0x00090 0x00090 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .interp 
   03     .text 
   04     
   05     .got 
   06     .plt 
   07     
   08     .rel.dyn 
   09     .gnu.version 
   10     .gnu.version_r 
   11     .hash 
   12     .dynsym 
   13     .dynstr 
   14     .dynamic 
   15     .strtab 
   16     .symtab 
   17     .dynamic 


Я выяснил, что крэш происходит в функции _dl_relocate_object, но
что делать с этими знаниями дальше - непонятно. В крайнем случае
придется вставлять море отладочной печати и подменять системный 
загрузчик с риском загубить систему и последующими за этим геморами
с реанимацией :_(

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

отличие ld-linux.so.2 myelf и ./myelf, IMHO, только в том, что внутри него возникают ненулевые relocations. попробуй перед запуском своего ELF сделать export LD_BIND_NOW=1

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

Спасибо, но LD_BIND_NOW=1 не помогает. Ж... в том, что линкер не гнусный, а нашего производства, сделанный для специальных целей. Файлы ELF, которые он рожает, работают везде, кроме этого RH7.2. Исходник - просто крохотная прога на асме, которая затягивает из libc символ stdout. Если этот импорт убрать или поменять на импорт функции, а не переменной, - все будет ОК. Так что действительно, я выставил LD_DEBUG=all, там видно, что крэш происходит в процессе релокациии.

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

А можешь пример файла прислать на murrych@yandex.ru ?

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