register_tm_clones
和deregister_tm_clones
引用了超出我的RW段结束地址的内存地址。这个内存是如何被追踪的?
示例:在下面的示例中,deregister_tm_clones
引用了内存地址0x601077
,但我们分配的最后一个RW段,.bss
从地址0x601069
开始,大小为0x7
,加起来得到0x601070
。所以该引用明显超出了为.bss
段分配的空间,应该在我们的堆空间中,但是谁在管理它呢?
objdump -d main
...
0000000000400540 <deregister_tm_clones>:
400540: b8 77 10 60 00 mov $0x601077,%eax
400545: 55 push %rbp
400546: 48 2d 70 10 60 00 sub $0x601070,%rax
40054c: 48 83 f8 0e cmp $0xe,%rax
...
readelf -S main
...
[25] .data PROGBITS 0000000000601040 00001040
0000000000000029 0000000000000000 WA 0 0 16
[26] .bss NOBITS 0000000000601069 00001069
0000000000000007 0000000000000000 WA 0 0 1
[27] .comment PROGBITS 0000000000000000 00001069
0000000000000058 0000000000000001 MS 0 0 1
[28] .shstrtab STRTAB 0000000000000000 000019f2
000000000000010c 0000000000000000 0 0 1
[29] .symtab SYMTAB 0000000000000000 000010c8
00000000000006c0 0000000000000018 30 47 8
[30] .strtab STRTAB 0000000000000000 00001788
000000000000026a 0000000000000000 0 0 1
请注意,引用从.bss
节的末尾开始。当我使用gdb检查分配的内存时,我看到有足够的空间,所以它可以正常工作,但我不知道这个内存是如何管理的。Start Addr End Addr Size Offset objfile
0x400000 0x401000 0x1000 0x0 /home/nobody/main
0x600000 0x601000 0x1000 0x0 /home/nobody/main
0x601000 0x602000 0x1000 0x1000 /home/nobody/main
0x7ffff7a17000 0x7ffff7bd0000 0x1b9000 0x0 /usr/lib64/libc-2.23.so
我在其他部分找不到对它的任何引用。在加载给.bss段的部分中也没有为它保留空间:
LOAD 0x0000000000000e10 0x0000000000600e10 0x0000000000600e10
0x0000000000000259 0x0000000000000260 RW 200000
有人可以解释一下这些函数吗?源代码在哪里?我已经阅读了所有关于事务性内存的参考资料,但它们只涵盖编程而不是实现。我找不到一个编译器选项来删除这些代码,除了当然会留下什么都没有的-nostdlibs
。
也许这些函数是malloc的一部分吗?但对于那些没有使用malloc、线程或STM的代码,我不确定是否应该将它们链接到我的代码中。
更多细节:
$ make main
cc -c -o main.o main.c
cc -o main main.o
$ which cc
/usr/bin/cc
$ cc --version
cc (GCC) 6.2.1 20160916 (Red Hat 6.2.1-2)
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cc --verbose
Using built-in specs.
COLLECT_GCC=cc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/6.2.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap
--enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto
--prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared
--enable-threads=posix --enable-checking=release --enable-multilib
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-gnu-unique-object --enable-linker-build-id
--with-linker-hash-style=gnu --enable-plugin --enable-initfini-array
--disable-libgcj --with-isl --enable-libmpx --enable-gnu-indirect-function
--with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 6.2.1 20160916 (Red Hat 6.2.1-2) (GCC)
__TMC_END__+7
的地方,这与你看到的值相匹配,所以我想知道gcc历史上是否有一些无意义的东西,比如在文件中可能是(char *)(__TMC_END__+1)-1
。 - R.. GitHub STOP HELPING ICE.data 00000000006050d8 000050d8 0000000000000004 .bss 00000000006050e0 000050dc 0000000000000030
,.dynsym显示__start_bss
作为基于文件偏移而非地址的地址86:00000000006050dc 0 NOTYPE GLOBAL DEFAULT 27 __bss_start
。���自/bin/getconf的数据 - 是否有某种方法确定编译此代码的gcc版本? - brookbot