7

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)
4

1 に答える 1