register_tm_clonesderegister_tm_clonesRW セクションの終わりを過ぎたメモリ アドレスを参照しています。このメモリはどのように追跡されますか?
例:以下の例では、deregister_tm_clonesメモリ アドレス0x601077を参照していますが、最後に割り当てた RW セクションは から.bss始まり、0x601069サイズは であり、さらに0x7get が追加されています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、threading、または STM を使用していないコードについては、これらをコードにリンクする必要があることに同意するかどうかはわかりません。
gcc は Linux ELF にどのような機能を追加しますか?も参照してください。
詳細:
$ 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)