我可以 link 图书馆除了特定的符号吗?
can I link library except specific symbol?
条件1.我有myassembly.s
没有main
.
条件 2. 相反,myassembly.s
具有 全局符号 _start
。
条件3.我要link_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
问题。我可以linkcrt1.o
没有_start
吗?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~
...
附上我的具体情况,可能是分析需要的资料。
这里是myassembly.s
.
如上述情况,它使用_start
而没有main
。
.global _start
_start:
push $_STRING1
push $_STRING2
call printf
push [=12=]
call exit
_STRING1:
.string "gogo\n"
_STRING2:
.string "%s"
我 assemble 和 link 编辑了它:
jiwon@jiwon:/tmp$ as -o Whosebug.o Whosebug.s
jiwon@jiwon:/tmp$ ld -o Whosebug -dynamic-linker /lib/ld-linux.so.2 /usr/lib/i386-linux-gnu/crti.o -lc Whosebug.o /usr/lib/i386-linux-gnu/crtn.o
jiwon@jiwon:/tmp$ ./Whosebug
gogo
正如您在上面看到的,输出二进制文件运行良好。
然而,当我尝试 crt1.o
被 linked 时,错误发生了。
jiwon@jiwon:/tmp$ ld -o Whosebug -dynamic-linker /lib/ld-linux.so.2 /usr/lib/i386-linux-gnu/crti.o -lc Whosebug.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'
Whosebug.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'
问题(相同) 我可以 link crt1.o
没有 _start
吗?
与其拉进 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
标记为链接器必须从某处引入的未定义全局符号。
条件1.我有myassembly.s
没有main
.
条件 2. 相反,myassembly.s
具有 全局符号 _start
。
条件3.我要link_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
问题。我可以linkcrt1.o
没有_start
吗?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~
...
附上我的具体情况,可能是分析需要的资料。
这里是myassembly.s
.
如上述情况,它使用_start
而没有main
。
.global _start
_start:
push $_STRING1
push $_STRING2
call printf
push [=12=]
call exit
_STRING1:
.string "gogo\n"
_STRING2:
.string "%s"
我 assemble 和 link 编辑了它:
jiwon@jiwon:/tmp$ as -o Whosebug.o Whosebug.s
jiwon@jiwon:/tmp$ ld -o Whosebug -dynamic-linker /lib/ld-linux.so.2 /usr/lib/i386-linux-gnu/crti.o -lc Whosebug.o /usr/lib/i386-linux-gnu/crtn.o
jiwon@jiwon:/tmp$ ./Whosebug
gogo
正如您在上面看到的,输出二进制文件运行良好。
然而,当我尝试 crt1.o
被 linked 时,错误发生了。
jiwon@jiwon:/tmp$ ld -o Whosebug -dynamic-linker /lib/ld-linux.so.2 /usr/lib/i386-linux-gnu/crti.o -lc Whosebug.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'
Whosebug.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'
问题(相同) 我可以 link crt1.o
没有 _start
吗?
与其拉进 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
标记为链接器必须从某处引入的未定义全局符号。