2010-01-08 23 views
6

Thư viện không phải lúc nào cũng chứa biểu tượng _mcount, nhưng các ứng dụng thực hiện (bạn có thể xác minh điều này bằng gobjdump hoặc tiện ích nm). Tôi đã đọc _mcount được sử dụng để thực hiện lược tả, nhưng biểu tượng có mặt ngay cả khi lược tả bị tắt và tối ưu hóa được kích hoạt (-O2). Nó có phục vụ một số mục đích bổ sung khác không?Tại sao các ứng dụng được biên soạn bởi GCC luôn chứa ký hiệu _mcount?

Cập nhật: Tôi đang sử dụng Solaris, vì vậy đây là trình liên kết Solaris kết hợp với GCC, tôi không chắc liệu điều đó có tạo nên sự khác biệt hay không. Phiên bản GCC là 4.2.2. Điều này xảy ra ngay cả khi tôi biên dịch một tệp chỉ chứa mã int main() { return 0; } mà không có thư viện nào được liên kết.

Update2: Tôi gõ:

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

Và g ++ không được lấy bí danh là bất cứ điều gì. Ngoài ra, tôi đã cố gắng biên dịch với trình biên dịch CC mặt trời, và nó không có vấn đề này. Tôi cũng đã thử cập nhật GCC, biểu tượng vẫn tồn tại trong 4.4.1.

+1

Hệ thống của bạn không xảy ra để có 'gcc' (hoặc lệnh bạn đang sử dụng) được đặt biệt danh cho một cái gì đó gọi trình biên dịch với một số công tắc mặc định, phải không? Bạn có thể đăng các cuộc gọi chính xác mà bạn đang sử dụng để biên dịch không? –

+0

Không có bí danh, bài đăng được cập nhật bằng lệnh. –

Trả lời

4

Hm. lạ, trên máy tính của tôi (Ubuntu 9.10) điều này không xảy ra.

Đối với một bài kiểm tra tôi chỉ biên soạn một hello-chữ nhỏ:

#include <stdio.h> 

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

biên soạn với

gcc test.c 

Nó không có biểu tượng _mcount. Tôi đã kiểm tra với: (. -g, -pg vv)

nm a.out | grep -i count 

Cố gắng một số công tắc biên dịch nó chỉ ra rằng các biểu tượng chỉ xuất hiện nếu bạn biên dịch ứng dụng của bạn với -pg, Trong trường hợp này bạn biên dịch với hồ sơ được kích hoạt, vì vậy biểu tượng _mcount có lý do để tồn tại.

+0

Tôi đã cập nhật bài đăng của mình để làm rõ rằng tôi không chỉ định pg, nhưng nó vẫn xảy ra. Tự hỏi sự khác biệt là gì ... –

2

Bạn đang liên kết với thư viện có bật tiểu sử chưa? Điều đó sẽ kéo vào _mcount.

+0

Không, hãy xem bản cập nhật của tôi. –

1

Để biết thông tin,

Trên hộp của tôi Linux (Archlinux x86), GCC 4.4.2, chạy nm trên a.out cho:

$ 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 

và chạy ldd trên a.out cho

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

Cố gắng tìm hiểu xem một trong các thư viện phụ thuộc đã được xây dựng có hỗ trợ lược tả bằng cách chạyhay khôngtrên chúng. Như @Emerick đã nói, điều này sẽ kéo theo số _mcount.

+0

Tôi không liên kết bất kỳ thư viện nào, xem bài đăng gốc của tôi. –

+1

cũng 'g ++' liên kết với 'libc' tự động, hãy thử nó –

+0

Thú vị, tôi đã thử và libc có ký hiệu _mcount_newent, nhưng không có _mcount. Những người khác không hiển thị bất cứ điều gì trong khi grepping cho _mcount. Vẫn không giải thích tại sao _mcount sẽ hiển thị:/Googling cho _mcount_newent Tôi nhận được một số kết quả mã nguồn tối nghĩa nhưng không có giải thích tiếng Anh tốt. –

1

Không helpeful, nhưng có lẽ thông tin:

Trên một tươi cài đặt của OpenSolaris và g ++, tôi thấy kết quả tương tự.

Trong trang người dùng cho gcc/++ trên OpenSolaris nó ghi chú mức mặc định của thông tin gỡ lỗi là "2" ... nhưng việc thay đổi thành 1 hoặc 0 không loại bỏ biểu tượng _mcount.

Nếu tôi biên dịch với cc-5,0, biểu tượng _mcount không xuất hiện. (mặc dù biên dịch với cc nó là cc chỉ là một bí danh/wrapper cho gcc).

Trên Ubuntu và Fedora, biểu tượng không xuất hiện trừ khi biên dịch với tùy chọn -pg (trong trường hợp đó ký hiệu là số tiền thay vì _mcount).

+0

Điều đó rất thú vị, tôi có thể đặt trong báo cáo lỗi cho các nhà phát triển GCC, upvoted :) –

Các vấn đề liên quan