atexit的代码是如何来的呢?
1.c
- int main()
- {
- printf("Hello World!\n");
- return 0;
- }
复制代码
gcc -V -pg 1.c -o 1
- [root@proxy ~/3]# gcc -v -pg 1.c -o 1
- Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
- gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)
- /usr/lib/gcc-lib/i386-redhat-linux/2.96/cpp0 -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=96 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__NO_INLINE__ -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_i386__ 1.c /tmp/cchoxKb5.i
- GNU CPP version 2.96 20000731 (Red Hat Linux 7.1 2.96-98) (cpplib) (i386 Linux/ELF)
- ignoring nonexistent directory "/usr/local/include"
- ignoring nonexistent directory "/usr/i386-redhat-linux/include"
- #include "..." search starts here:
- #include <...> search starts here:
- /usr/lib/gcc-lib/i386-redhat-linux/2.96/include
- /usr/include
- End of search list.
- /usr/lib/gcc-lib/i386-redhat-linux/2.96/cc1 /tmp/cchoxKb5.i -quiet -dumpbase 8.c -version -p -o /tmp/cc6iNLJ3.s
- GNU C version 2.96 20000731 (Red Hat Linux 7.1 2.96-98) (i386-redhat-linux) compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.1 2.96-98).
- as -V -Qy -o /tmp/ccTQbTp1.o /tmp/cc6iNLJ3.s
- GNU assembler version 2.11.90.0.8 (i386-redhat-linux) using BFD version 2.11.90.0.8
- /usr/lib/gcc-lib/i386-redhat-linux/2.96/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o 1 /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../gcrt1.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crti.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtbegin.o -L/usr/lib/gcc-lib/i386-redhat-linux/2.96 -L/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../.. /tmp/ccTQbTp1.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtend.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crtn.o
复制代码
objdump -S 1会发现连接了一个atext代码,不知从何而来,在gcrt1.o,crtbegin.o,crtend.o,cetn.o中没有找到
- 080485dc <atexit>:
- 80485dc: 55 push %ebp
- 80485dd: 89 e5 mov %esp,%ebp
- 80485df: 53 push %ebx
- 80485e0: 52 push %edx
- 80485e1: e8 00 00 00 00 call 80485e6 <atexit+0xa>
- 80485e6: 5b pop %ebx
- 80485e7: 81 c3 ba 10 00 00 add $0x10ba,%ebx
- 80485ed: 50 push %eax
- 80485ee: 8b 83 30 00 00 00 mov 0x30(%ebx),%eax
- 80485f4: 31 d2 xor %edx,%edx
- 80485f6: 85 c0 test %eax,%eax
- 80485f8: 74 02 je 80485fc <atexit+0x20>
- 80485fa: 8b 10 mov (%eax),%edx
- 80485fc: 52 push %edx
- 80485fd: 6a 00 push $0x0
- 80485ff: ff 75 08 pushl 0x8(%ebp)
- 8048602: e8 cd fd ff ff call 80483d4 <_init+0x48>
- 8048607: 83 c4 10 add $0x10,%esp
- 804860a: 8b 5d fc mov 0xfffffffc(%ebp),%ebx
- 804860d: c9 leave
- 804860e: c3 ret
- 804860f: 90 nop
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
atexit是标准库里的东西,libc.a里面查查就有
发现链接时会使用/usr/lib/libc.so
复制代码
不知为何要将这些函数独立出来?不能共享?
不共享?什么意思?
复制代码
在libc.so.6中找到了atexit的代码,为何还要单独复制一份到目标文件呢?