Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc Objdump&x27;不匹配源代码_Gcc_Assembly_Compilation_Objdump_Libgomp - Fatal编程技术网

Gcc Objdump&x27;不匹配源代码

Gcc Objdump&x27;不匹配源代码,gcc,assembly,compilation,objdump,libgomp,Gcc,Assembly,Compilation,Objdump,Libgomp,我正在调查一个链接到libgomp的OpenMP程序的执行流程。它使用#pragma omp parallel for。我已经知道,除其他外,该构造成为对GOMP_parallel函数的调用,其实现如下: void GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags) { num_threads = gomp_resolve_num_

我正在调查一个链接到libgomp的OpenMP程序的执行流程。它使用
#pragma omp parallel for
。我已经知道,除其他外,该构造成为对
GOMP_parallel
函数的调用,其实现如下:

void
GOMP_parallel (void (*fn) (void *), void *data, 
               unsigned num_threads, unsigned int flags)
{
   num_threads = gomp_resolve_num_threads (num_threads, 0);
   gomp_team_start (fn, data, num_threads, flags, gomp_new_team (num_threads));
   fn (data);
   ialias_call (GOMP_parallel_end) ();
}
在libgomp上执行
objdump-d
时,
GOMP_parallel
显示如下:

000000000000bc80 <GOMP_parallel@@GOMP_4.0>:
bc80:   41 55                   push   %r13
bc82:   41 54                   push   %r12
bc84:   41 89 cd                mov    %ecx,%r13d
bc87:   55                      push   %rbp
bc88:   53                      push   %rbx
bc89:   48 89 f5                mov    %rsi,%rbp
bc8c:   48 89 fb                mov    %rdi,%rbx
bc8f:   31 f6                   xor    %esi,%esi
bc91:   89 d7                   mov    %edx,%edi
bc93:   48 83 ec 08             sub    $0x8,%rsp
bc97:   e8 d4 fd ff ff          callq  ba70 <GOMP_ordered_end@@GOMP_1.0+0x70>
bc9c:   41 89 c4                mov    %eax,%r12d
bc9f:   89 c7                   mov    %eax,%edi
bca1:   e8 ca 37 00 00          callq  f470 <omp_in_final@@OMP_3.1+0x2c0>
bca6:   44 89 e9                mov    %r13d,%ecx
bca9:   44 89 e2                mov    %r12d,%edx
bcac:   48 89 ee                mov    %rbp,%rsi
bcaf:   48 89 df                mov    %rbx,%rdi
bcb2:   49 89 c0                mov    %rax,%r8
bcb5:   e8 16 39 00 00          callq  f5d0 <omp_in_final@@OMP_3.1+0x420>
bcba:   48 89 ef                mov    %rbp,%rdi
bcbd:   ff d3                   callq  *%rbx
bcbf:   48 83 c4 08             add    $0x8,%rsp
bcc3:   5b                      pop    %rbx
bcc4:   5d                      pop    %rbp
bcc5:   41 5c                   pop    %r12
bcc7:   41 5d                   pop    %r13
bcc9:   e9 32 ff ff ff          jmpq   bc00 <GOMP_parallel_end@@GOMP_1.0>
bcce:   66 90                   xchg   %ax,%ax
根据objdump输出,此函数从
ba00
开始,在
bbbd
结束。一个空函数中怎么会有这么多代码?顺便说一句,libgomp的源代码中有一条评论说,它应该只在使用有序结构(顾名思义)时出现,这与我的测试不同

最后,我主要关心的是:为什么源代码与反汇编有如此大的不同?例如,为什么在汇编中没有提到
gomp\u team\u start

系统具有gcc 5.4.0版

根据objdump输出,此函数从ba00开始,在bbbd结束。 一个空函数中怎么会有这么多代码

函数本身很小,但GCC只是使用了一些额外的字节来对齐下一个函数并存储一些静态数据(可能被此文件中的其他函数使用)。以下是我在local
ordered.o
中看到的内容:

00000000000003b0 <GOMP_ordered_end>:
 3b0:   f3 c3                   repz retq
 3b2:   66 66 66 66 66 2e 0f    data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
 3b9:   1f 84 00 00 00 00 00

gcc内联了一些小函数。有些“函数”甚至可能是CPP宏。在
objdump-d
输出中没有调用
GOMP\u ordered\u end
。而是调用
GOMP_ordered_end@@GOMP_1.0+0x70
,这是一个未命名函数,位于
GOMP_ordered_end@@GOMP_1.0
开头0x70字节之后。如果您确实怀疑编译后的代码与源代码不同,第一步是查看C宏扩展后的代码(
gcc-E
)。下一步是查看生成的汇编代码(
gcc-S
)。对齐不足以解释空函数的
0xbd
字节。一定还有别的事情发生了。@yugr我真的是说“GOMP_ordered_end”。我想说的是:“GOMP_ordered_end”是如何在“GOMP_parallel”的反汇编中出现的,但在源代码中没有对该函数的调用?@PeterCordes是真的,但这不是问题的核心,所以我没有检查。。。
00000000000003b0 <GOMP_ordered_end>:
 3b0:   f3 c3                   repz retq
 3b2:   66 66 66 66 66 2e 0f    data32 data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
 3b9:   1f 84 00 00 00 00 00
bcb5:   e8 16 39 00 00          callq  f5d0 <omp_in_final@@OMP_3.1+0x420>