я могу связать библиотеку, кроме конкретного символа? - PullRequest
0 голосов
/ 17 сентября 2018

Состояние 1. У меня есть myassembly.s, которых нет main.

Условие 2. Вместо этого myassembly.s имеет глобальный символ _start.

Условие 3. Я хочу связать _IO_stdin_used для вывода двоичного файла.

... а вот проблемная часть.
_IO_stdin_used утверждается на crt1.o, как вы можете видеть:

jiwon@jiwon:/tmp$ readelf -s /usr/lib/i386-linux-gnu/crt1.o
Symbol table '.symtab' contains 17 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 SECTION LOCAL  DEFAULT    1 
     ...
     8: 00000000     4 OBJECT  GLOBAL DEFAULT    4 _fp_hw
     9: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND __libc_csu_fini
    10: 00000000     0 FUNC    GLOBAL DEFAULT    2 _start
    11: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND __libc_csu_init
    12: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND main
    13: 00000000     0 NOTYPE  WEAK   DEFAULT    6 data_start
    14: 00000000     4 OBJECT  GLOBAL DEFAULT    5 _IO_stdin_used
    15: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND __libc_start_main
    16: 00000000     0 NOTYPE  GLOBAL DEFAULT    6 __data_start



Вопрос. Можно ли связать crt1.o без _start?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~

...

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

Вот myassembly.s.
В качестве вышеупомянутой ситуации, он использует _start и не имеет main.

.global _start
_start:
 push $_STRING1
 push $_STRING2
 call printf
 push $0
 call exit
_STRING1:
 .string "gogo\n"
_STRING2:
 .string "%s"


Я собираю и связываю это:

jiwon@jiwon:/tmp$ as -o stackoverflow.o stackoverflow.s 
jiwon@jiwon:/tmp$ ld -o stackoverflow -dynamic-linker /lib/ld-linux.so.2  /usr/lib/i386-linux-gnu/crti.o -lc stackoverflow.o /usr/lib/i386-linux-gnu/crtn.o

jiwon@jiwon:/tmp$ ./stackoverflow 
gogo


Как вы можете видеть выше, двоичный файл вывода работает хорошо. Однако, когда я попытался связать crt1.o, произошла ошибка.

jiwon@jiwon:/tmp$ ld -o stackoverflow -dynamic-linker /lib/ld-linux.so.2  /usr/lib/i386-linux-gnu/crti.o -lc stackoverflow.o /usr/lib/i386-linux-gnu/crtn.o /usr/lib/i386-linux-gnu/crt1.o
/usr/lib/i386-linux-gnu/crt1.o: In function `_start':
(.text+0x0): multiple definition of `_start'
stackoverflow.o:(.text+0x0): first defined here
/usr/lib/i386-linux-gnu/crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/i386-linux-gnu/crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
/usr/lib/i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'



Вопрос (тот же) Можно ли связать crt1.o без _start?

1 Ответ

0 голосов
/ 17 сентября 2018

Вместо того, чтобы тянуть весь хвост крысы crt1.o, как насчет того, чтобы просто определить _IO_stdin_used себя?Просто поместите этот код в один из ваших файлов сборки:

        .section .rodata
        .globl _IO_stdin_used
        .type _IO_stdin_used, @object
        .align 4
_IO_stdin_used:
        .int 0x20001
        .size _IO_stdin_used, 4

В противном случае, если вы просто хотите требовать наличия _IO_stdin_used, не определяя его самостоятельно (например, потому что его определяет какой-то файл в libc)), просто поместите эту строку в один из ваших файлов сборки:

        .globl _IO_stdin_used

Это заставит ассемблер пометить _IO_stdin_used как неопределенный глобальный символ, который компоновщик должен откуда-то вытянуть.

...