2010-01-08 123 views
6

庫不總是包含_mcount符號,但應用程序可以(您可以使用gobjdump或nm工具來驗證)。我讀過_mcount用於實現分析,但是即使禁用了分析並啓用了優化(-O2),符號仍然存在。它是否有其他用途?爲什麼由GCC編譯的應用程序總是包含_mcount符號?

更新:我在Solaris上,所以這是Solaris鏈接器與GCC結合,我不確定這是否有所作爲。 GCC版本是4.2.2。即使我編譯的文件只包含代碼int main() { return 0; }而沒有鏈接庫,也會發生這種情況。

UPDATE2:I型:

$ g++ -O2 mytest.cpp 
$ nm a.out | grep _mcount 
[65] | 134547444|  1|FUNC |GLOB |0 |11  |_mcount 

和g ++是沒有別名任何東西。另外,我嘗試使用Sun CC編譯器進行編譯,但沒有這個問題。我也試過更新GCC,符號依然存在於4.4.1中。

+1

你的系統沒有碰到有'gcc'(或者你正在使用的命令)別名到某些使用默認開關調用編譯器的東西,是嗎?你可以發佈你正在使用的確切電話來編譯這個嗎? – 2010-01-08 17:51:52

+0

沒有別名,用命令更新後。 – 2010-01-08 18:51:46

回答

4

嗯。奇怪的是,在我的機器上(ubuntu 9.10),這不會發生。

因爲我剛剛編譯了一個小你好字測試:

#include <stdio.h> 

int main (int argc, char **args) 
{ 
    printf ("hello world\n"); 
} 

編譯

gcc test.c 

它不具有_mcount符號。 (-g,-pg ECT):我檢查

nm a.out | grep -i count 

嘗試一些編譯器開關事實證明,如果你使用-pg編譯應用程序的符號纔會出現,在這種情況下你分析編譯啓用,所以_mcount符號有一個存在的理由。

+0

我已更新我的帖子以澄清我沒有指定pg,但它仍然發生。不知道有什麼區別... – 2010-01-08 17:48:51

2

您是否正在與啓用了配置文件的庫鏈接?那會拉到_mcount

+0

不,請參閱我的更新。 – 2010-01-08 17:54:02

1

有關信息,

在我的Linux機器(86的Archlinux),GCC 4.4.2,對a.out運行nm給出:

$ nm ./a.out 
08049594 d _DYNAMIC 
08049680 d _GLOBAL_OFFSET_TABLE_ 
0804852c R _IO_stdin_used 
     w _Jv_RegisterClasses 
08049584 d __CTOR_END__ 
08049580 d __CTOR_LIST__ 
0804958c D __DTOR_END__ 
08049588 d __DTOR_LIST__ 
0804857c r __FRAME_END__ 
08049590 d __JCR_END__ 
08049590 d __JCR_LIST__ 
080496a0 A __bss_start 
08049698 D __data_start 
080484e0 t __do_global_ctors_aux 
080483d0 t __do_global_dtors_aux 
0804969c D __dso_handle 
     w __gmon_start__ 
     U [email protected]@CXXABI_1.3 
080484da T __i686.get_pc_thunk.bx 
08049580 d __init_array_end 
08049580 d __init_array_start 
08048470 T __libc_csu_fini 
08048480 T __libc_csu_init 
     U [email protected]@GLIBC_2.0 
080496a0 A _edata 
080496a8 A _end 
0804850c T _fini 
08048528 R _fp_hw 
08048324 T _init 
080483a0 T _start 
080496a0 b completed.5829 
08049698 W data_start 
080496a4 b dtor_idx.5831 
08048430 t frame_dummy 
08048460 T main 

和運行ldda.out

$ ldd ./a.out 
linux-gate.so.1 => (0xb77b1000) 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb769b000) 
    libm.so.6 => /lib/libm.so.6 (0xb7675000) 
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0xb7658000) 
    libc.so.6 => /lib/libc.so.6 (0xb7511000) 
    /lib/ld-linux.so.2 (0xb77b2000) 

試着找出是否有一個依賴庫已經通過運行來建立分析支持。正如@埃默裏克所說,這會拉到_mcount

+0

我沒有鏈接任何庫,請參閱我的原始帖子。 – 2010-01-12 03:53:49

+1

well'g ++'自動鏈接到'libc',試試吧 – 2010-01-12 07:35:03

+0

有趣的是,我試過了,libc有一個符號_mcount_newent,但沒有_mcount。其他人在爲_mcount刷新時不顯示任何內容。仍然不能解釋爲什麼_mcount會顯示:/谷歌搜索_mcount_newent我得到一些晦澀的源代碼結果,但沒有很好的英文解釋。 – 2010-01-13 16:46:37

1

不helpeful,但也許信息:

在一個新安裝的OpenSolaris和克++,我看到了同樣的結果。

在OpenSolaris上gcc/++的手冊頁中,它指出調試信息的默認級別爲「2」...但將其更改爲1或0並不會消除_mcount符號。

如果我用cc-5.0編譯,_mcount符號不存在。 (儘管用cc編譯它就是因爲cc只是gcc的別名/包裝器)。

在Ubuntu和Fedora上,除非使用-pg選項編譯(在這種情況下符號是mcount而不是_mcount),否則符號不存在。

+0

這非常有趣,我可以把它放在GCC開發者的錯誤報告中,upvoted :) – 2010-01-15 17:02:07

相關問題