2016-08-02 101 views
0

這個問題具體涉及x86架構,g++編譯器和c++代碼。C++將ELF文件中的類變量保存在哪裏?

所以,我有以下代碼:

#include <iostream> 

int second; 

class First { 
private: 
     int hello; 
public: 
     First(int number) 
     { 
      hello = number; 
     } 

     void printStuff() 
     { 
      std::cout<<this->hello<<'\n'; 
     } 
}; 

int main(int argc, char** argv) 
{ 
    First *first = new First(argc); 
    first->printStuff(); 
    second = argc; 
    return 0; 
} 

編譯它像這樣經過:

g++ -O0 -g class.cpp -o class

我得到的輸出class二進制文件。

現在,我想知道hello存儲,所以我做readelf -s ./class和輸出是:

[[email protected] tmp14]$ readelf -s --wide ./class 

Symbol table '.dynsym' contains 13 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_3.4 (2) 
    2: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
    3: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 
    4: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_3.4 (2) 
    5: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (3) 
    6: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (3) 
    7: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_3.4 (2) 
    8: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable 
    9: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 
    10: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_3.4 (2) 
    11: 00000000004006c0  0 FUNC GLOBAL DEFAULT UND [email protected]_3.4 (2) 
    12: 0000000000600dc0 272 OBJECT GLOBAL DEFAULT 26 [email protected]_3.4 (2) 

Symbol table '.symtab' contains 88 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 0000000000400200  0 SECTION LOCAL DEFAULT 1 
    2: 000000000040021c  0 SECTION LOCAL DEFAULT 2 
    3: 000000000040023c  0 SECTION LOCAL DEFAULT 3 
    4: 0000000000400260  0 SECTION LOCAL DEFAULT 4 
    5: 0000000000400288  0 SECTION LOCAL DEFAULT 5 
    6: 00000000004003c0  0 SECTION LOCAL DEFAULT 6 
    7: 0000000000400502  0 SECTION LOCAL DEFAULT 7 
    8: 0000000000400520  0 SECTION LOCAL DEFAULT 8 
    9: 0000000000400560  0 SECTION LOCAL DEFAULT 9 
    10: 0000000000400590  0 SECTION LOCAL DEFAULT 10 
    11: 0000000000400638  0 SECTION LOCAL DEFAULT 11 
    12: 0000000000400660  0 SECTION LOCAL DEFAULT 12 
    13: 00000000004006e0  0 SECTION LOCAL DEFAULT 13 
    14: 00000000004006f0  0 SECTION LOCAL DEFAULT 14 
    15: 0000000000400944  0 SECTION LOCAL DEFAULT 15 
    16: 0000000000400950  0 SECTION LOCAL DEFAULT 16 
    17: 0000000000400958  0 SECTION LOCAL DEFAULT 17 
    18: 00000000004009b0  0 SECTION LOCAL DEFAULT 18 
    19: 0000000000600b30  0 SECTION LOCAL DEFAULT 19 
    20: 0000000000600b40  0 SECTION LOCAL DEFAULT 20 
    21: 0000000000600b48  0 SECTION LOCAL DEFAULT 21 
    22: 0000000000600b50  0 SECTION LOCAL DEFAULT 22 
    23: 0000000000600d50  0 SECTION LOCAL DEFAULT 23 
    24: 0000000000600d58  0 SECTION LOCAL DEFAULT 24 
    25: 0000000000600da8  0 SECTION LOCAL DEFAULT 25 
    26: 0000000000600dc0  0 SECTION LOCAL DEFAULT 26 
    27: 0000000000000000  0 SECTION LOCAL DEFAULT 27 
    28: 0000000000000000  0 SECTION LOCAL DEFAULT 28 
    29: 0000000000000000  0 SECTION LOCAL DEFAULT 29 
    30: 0000000000000000  0 SECTION LOCAL DEFAULT 30 
    31: 0000000000000000  0 SECTION LOCAL DEFAULT 31 
    32: 0000000000000000  0 SECTION LOCAL DEFAULT 32 
    33: 0000000000000000  0 SECTION LOCAL DEFAULT 33 
    34: 0000000000000000  0 FILE LOCAL DEFAULT ABS init.c 
    35: 0000000000000000  0 FILE LOCAL DEFAULT ABS crtstuff.c 
    36: 0000000000600b48  0 OBJECT LOCAL DEFAULT 21 __JCR_LIST__ 
    37: 0000000000400720  0 FUNC LOCAL DEFAULT 14 deregister_tm_clones 
    38: 0000000000400760  0 FUNC LOCAL DEFAULT 14 register_tm_clones 
    39: 00000000004007a0  0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux 
    40: 0000000000600ed0  1 OBJECT LOCAL DEFAULT 26 completed.6938 
    41: 0000000000600b40  0 OBJECT LOCAL DEFAULT 20 __do_global_dtors_aux_fini_array_entry 
    42: 00000000004007c0  0 FUNC LOCAL DEFAULT 14 frame_dummy 
    43: 0000000000600b30  0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_entry 
    44: 0000000000000000  0 FILE LOCAL DEFAULT ABS class.cpp 
    45: 0000000000400954  1 OBJECT LOCAL DEFAULT 16 _ZStL19piecewise_construct 
    46: 0000000000600ed8  1 OBJECT LOCAL DEFAULT 26 _ZStL8__ioinit 
    47: 0000000000400835 62 FUNC LOCAL DEFAULT 14 _Z41__static_initialization_and_destruction_0ii 
    48: 0000000000400873 21 FUNC LOCAL DEFAULT 14 _GLOBAL__sub_I_second 
    49: 0000000000000000  0 FILE LOCAL DEFAULT ABS crtstuff.c 
    50: 0000000000400b28  0 OBJECT LOCAL DEFAULT 18 __FRAME_END__ 
    51: 0000000000600b48  0 OBJECT LOCAL DEFAULT 21 __JCR_END__ 
    52: 0000000000000000  0 FILE LOCAL DEFAULT ABS 
    53: 0000000000400958  0 NOTYPE LOCAL DEFAULT 17 __GNU_EH_FRAME_HDR 
    54: 0000000000600d58  0 OBJECT LOCAL DEFAULT 24 _GLOBAL_OFFSET_TABLE_ 
    55: 0000000000600b40  0 NOTYPE LOCAL DEFAULT 19 __init_array_end 
    56: 0000000000600b30  0 NOTYPE LOCAL DEFAULT 19 __init_array_start 
    57: 0000000000600b50  0 OBJECT LOCAL DEFAULT 22 _DYNAMIC 
    58: 0000000000600da8  0 NOTYPE WEAK DEFAULT 25 data_start 
    59: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBCXX_3.4 
    60: 0000000000400940  2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini 
    61: 0000000000600ed4  4 OBJECT GLOBAL DEFAULT 26 second 
    62: 00000000004006f0 42 FUNC GLOBAL DEFAULT 14 _start 
    63: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
    64: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 
    65: 0000000000400944  0 FUNC GLOBAL DEFAULT 15 _fini 
    66: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBCXX_3.4 
    67: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 
    68: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 
    69: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBCXX_3.4 
    70: 00000000004006c0  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBCXX_3.4 
    71: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable 
    72: 0000000000400950  4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used 
    73: 0000000000400888 23 FUNC WEAK DEFAULT 14 _ZN5FirstC1Ei 
    74: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 
    75: 0000000000600da8  0 NOTYPE GLOBAL DEFAULT 25 __data_start 
    76: 00000000004008a0 46 FUNC WEAK DEFAULT 14 _ZN5First10printStuffEv 
    77: 0000000000400888 23 FUNC WEAK DEFAULT 14 _ZN5FirstC2Ei 
    78: 0000000000600db8  0 OBJECT GLOBAL HIDDEN 25 __TMC_END__ 
    79: 0000000000600dc0 272 OBJECT GLOBAL DEFAULT 26 [email protected]@GLIBCXX_3.4 
    80: 0000000000600db0  0 OBJECT GLOBAL HIDDEN 25 __dso_handle 
    81: 00000000004008d0 101 FUNC GLOBAL DEFAULT 14 __libc_csu_init 
    82: 0000000000600db8  0 NOTYPE GLOBAL DEFAULT 26 __bss_start 
    83: 0000000000600ee0  0 NOTYPE GLOBAL DEFAULT 26 _end 
    84: 0000000000600db8  0 NOTYPE GLOBAL DEFAULT 25 _edata 
    85: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBCXX_3.4 
    86: 00000000004007e6 79 FUNC GLOBAL DEFAULT 14 main 
    87: 0000000000400638  0 FUNC GLOBAL DEFAULT 11 _init 

爲了更好的可讀性,我也跑這個命令:

[[email protected] tmp14]$ readelf -s --wide ./class | c++filt 

Symbol table '.dynsym' contains 13 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 0000000000000000  0 FUNC GLOBAL DEFAULT UND std::basic_ostream<char, std::char_traits<char> >::operator<<(int)@GLIBCXX_3.4 (2) 
    2: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
    3: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 
    4: 0000000000000000  0 FUNC GLOBAL DEFAULT UND std::ios_base::Init::Init()@GLIBCXX_3.4 (2) 
    5: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (3) 
    6: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (3) 
    7: 0000000000000000  0 FUNC GLOBAL DEFAULT UND std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)@GLIBCXX_3.4 (2) 
    8: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable 
    9: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 
    10: 0000000000000000  0 FUNC GLOBAL DEFAULT UND operator new(unsigned long)@GLIBCXX_3.4 (2) 
    11: 00000000004006c0  0 FUNC GLOBAL DEFAULT UND std::ios_base::Init::~Init()@GLIBCXX_3.4 (2) 
    12: 0000000000600dc0 272 OBJECT GLOBAL DEFAULT 26 std::[email protected]_3.4 (2) 

Symbol table '.symtab' contains 88 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 0000000000400200  0 SECTION LOCAL DEFAULT 1 
    2: 000000000040021c  0 SECTION LOCAL DEFAULT 2 
    3: 000000000040023c  0 SECTION LOCAL DEFAULT 3 
    4: 0000000000400260  0 SECTION LOCAL DEFAULT 4 
    5: 0000000000400288  0 SECTION LOCAL DEFAULT 5 
    6: 00000000004003c0  0 SECTION LOCAL DEFAULT 6 
    7: 0000000000400502  0 SECTION LOCAL DEFAULT 7 
    8: 0000000000400520  0 SECTION LOCAL DEFAULT 8 
    9: 0000000000400560  0 SECTION LOCAL DEFAULT 9 
    10: 0000000000400590  0 SECTION LOCAL DEFAULT 10 
    11: 0000000000400638  0 SECTION LOCAL DEFAULT 11 
    12: 0000000000400660  0 SECTION LOCAL DEFAULT 12 
    13: 00000000004006e0  0 SECTION LOCAL DEFAULT 13 
    14: 00000000004006f0  0 SECTION LOCAL DEFAULT 14 
    15: 0000000000400944  0 SECTION LOCAL DEFAULT 15 
    16: 0000000000400950  0 SECTION LOCAL DEFAULT 16 
    17: 0000000000400958  0 SECTION LOCAL DEFAULT 17 
    18: 00000000004009b0  0 SECTION LOCAL DEFAULT 18 
    19: 0000000000600b30  0 SECTION LOCAL DEFAULT 19 
    20: 0000000000600b40  0 SECTION LOCAL DEFAULT 20 
    21: 0000000000600b48  0 SECTION LOCAL DEFAULT 21 
    22: 0000000000600b50  0 SECTION LOCAL DEFAULT 22 
    23: 0000000000600d50  0 SECTION LOCAL DEFAULT 23 
    24: 0000000000600d58  0 SECTION LOCAL DEFAULT 24 
    25: 0000000000600da8  0 SECTION LOCAL DEFAULT 25 
    26: 0000000000600dc0  0 SECTION LOCAL DEFAULT 26 
    27: 0000000000000000  0 SECTION LOCAL DEFAULT 27 
    28: 0000000000000000  0 SECTION LOCAL DEFAULT 28 
    29: 0000000000000000  0 SECTION LOCAL DEFAULT 29 
    30: 0000000000000000  0 SECTION LOCAL DEFAULT 30 
    31: 0000000000000000  0 SECTION LOCAL DEFAULT 31 
    32: 0000000000000000  0 SECTION LOCAL DEFAULT 32 
    33: 0000000000000000  0 SECTION LOCAL DEFAULT 33 
    34: 0000000000000000  0 FILE LOCAL DEFAULT ABS init.c 
    35: 0000000000000000  0 FILE LOCAL DEFAULT ABS crtstuff.c 
    36: 0000000000600b48  0 OBJECT LOCAL DEFAULT 21 __JCR_LIST__ 
    37: 0000000000400720  0 FUNC LOCAL DEFAULT 14 deregister_tm_clones 
    38: 0000000000400760  0 FUNC LOCAL DEFAULT 14 register_tm_clones 
    39: 00000000004007a0  0 FUNC LOCAL DEFAULT 14 __do_global_dtors_aux 
    40: 0000000000600ed0  1 OBJECT LOCAL DEFAULT 26 completed.6938 
    41: 0000000000600b40  0 OBJECT LOCAL DEFAULT 20 __do_global_dtors_aux_fini_array_entry 
    42: 00000000004007c0  0 FUNC LOCAL DEFAULT 14 frame_dummy 
    43: 0000000000600b30  0 OBJECT LOCAL DEFAULT 19 __frame_dummy_init_array_entry 
    44: 0000000000000000  0 FILE LOCAL DEFAULT ABS class.cpp 
    45: 0000000000400954  1 OBJECT LOCAL DEFAULT 16 std::piecewise_construct 
    46: 0000000000600ed8  1 OBJECT LOCAL DEFAULT 26 std::__ioinit 
    47: 0000000000400835 62 FUNC LOCAL DEFAULT 14 __static_initialization_and_destruction_0(int, int) 
    48: 0000000000400873 21 FUNC LOCAL DEFAULT 14 _GLOBAL__sub_I_second 
    49: 0000000000000000  0 FILE LOCAL DEFAULT ABS crtstuff.c 
    50: 0000000000400b28  0 OBJECT LOCAL DEFAULT 18 __FRAME_END__ 
    51: 0000000000600b48  0 OBJECT LOCAL DEFAULT 21 __JCR_END__ 
    52: 0000000000000000  0 FILE LOCAL DEFAULT ABS 
    53: 0000000000400958  0 NOTYPE LOCAL DEFAULT 17 __GNU_EH_FRAME_HDR 
    54: 0000000000600d58  0 OBJECT LOCAL DEFAULT 24 _GLOBAL_OFFSET_TABLE_ 
    55: 0000000000600b40  0 NOTYPE LOCAL DEFAULT 19 __init_array_end 
    56: 0000000000600b30  0 NOTYPE LOCAL DEFAULT 19 __init_array_start 
    57: 0000000000600b50  0 OBJECT LOCAL DEFAULT 22 _DYNAMIC 
    58: 0000000000600da8  0 NOTYPE WEAK DEFAULT 25 data_start 
    59: 0000000000000000  0 FUNC GLOBAL DEFAULT UND std::basic_ostream<char, std::char_traits<char> >::operator<<(int)@@GLIBCXX_3.4 
    60: 0000000000400940  2 FUNC GLOBAL DEFAULT 14 __libc_csu_fini 
    61: 0000000000600ed4  4 OBJECT GLOBAL DEFAULT 26 second 
    62: 00000000004006f0 42 FUNC GLOBAL DEFAULT 14 _start 
    63: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
    64: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 
    65: 0000000000400944  0 FUNC GLOBAL DEFAULT 15 _fini 
    66: 0000000000000000  0 FUNC GLOBAL DEFAULT UND std::ios_base::Init::Init()@@GLIBCXX_3.4 
    67: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 
    68: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 
    69: 0000000000000000  0 FUNC GLOBAL DEFAULT UND std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)@@GLIBCXX_3.4 
    70: 00000000004006c0  0 FUNC GLOBAL DEFAULT UND std::ios_base::Init::~Init()@@GLIBCXX_3.4 
    71: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable 
    72: 0000000000400950  4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used 
    73: 0000000000400888 23 FUNC WEAK DEFAULT 14 First::First(int) 
    74: 0000000000000000  0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable 
    75: 0000000000600da8  0 NOTYPE GLOBAL DEFAULT 25 __data_start 
    76: 00000000004008a0 46 FUNC WEAK DEFAULT 14 First::printStuff() 
    77: 0000000000400888 23 FUNC WEAK DEFAULT 14 First::First(int) 
    78: 0000000000600db8  0 OBJECT GLOBAL HIDDEN 25 __TMC_END__ 
    79: 0000000000600dc0 272 OBJECT GLOBAL DEFAULT 26 std::[email protected]@GLIBCXX_3.4 
    80: 0000000000600db0  0 OBJECT GLOBAL HIDDEN 25 __dso_handle 
    81: 00000000004008d0 101 FUNC GLOBAL DEFAULT 14 __libc_csu_init 
    82: 0000000000600db8  0 NOTYPE GLOBAL DEFAULT 26 __bss_start 
    83: 0000000000600ee0  0 NOTYPE GLOBAL DEFAULT 26 _end 
    84: 0000000000600db8  0 NOTYPE GLOBAL DEFAULT 25 _edata 
    85: 0000000000000000  0 FUNC GLOBAL DEFAULT UND operator new(unsigned long)@@GLIBCXX_3.4 
    86: 00000000004007e6 79 FUNC GLOBAL DEFAULT 14 main 
    87: 0000000000400638  0 FUNC GLOBAL DEFAULT 11 _init 

我的問題是,變量first在哪裏?我在轉儲中看不到這個對象!請注意,second是以符號61的形式存在。我預計會損壞first,但不會完全消失...

有人嗎?

+1

爲什麼符號應該是在沒有指定調試標誌的輸出二進制文件中?如果有什麼我感到驚訝的是一個局部變量('second')存在。 –

+2

'second'是一個全局對象。 '第一個'只能作爲堆棧偏移量存在 –

+0

哦,對,忽略了'second'是全局的這一事實 - 這是有道理的。 –

回答

1

example.cpp:

class Clazz { 
    int x;    // will live wherever the instance of Clazz is created 
public: 
    Clazz(const std::initializer_list<int> & data) {} 
    Clazz() : x(13) {} // "13" is either in constructor code, or .rodata 
}; 

// these will end in .data section 
// except the list parameter {1, 2, 3}, which is const and lands in .rodata 
static int localInt; // local symbol, will be in .o file only in debug info 
int globalInt;   // global symbol 
    // btw, both are initialized to 0, as they are defined in .data 
static Clazz *classPtr = nullptr; 
Clazz classInstance({1, 2, 3}); 

// all global symbols from .data/.rodata/.bss/.text (.code) sections 
// will be visible in symbol table of executable (including the "foo" below) 

// everything else defined below (except foo) is runtime allocated, 
// and can't have any fixed address in symbol table, so it will not show there. 

void foo(int param) { // param is either on stack or in register (ABI specific) 
    Clazz localVar;  // localVar instance is living on the stack space 
    classPtr = new Clazz({}); 
    // Instance of Clazz pointed at by classPtr lives in global heap memory 
    // If not released by explicit "delete classPtr;" during runtime, 
    // it will cause memory leak (avoid using naked pointers like this). 
    int localInt;  // localInt lives on stack too, uninitialized = undefined value! 
    // On the contrary to *classPtr the localVar is released upon exiting it's scope 
} 

既不堆棧或堆實例是在ELF文件,在ELF文件是唯一的代碼能夠操縱實例,並創建實例(無論是在堆棧或堆上,要麼將其作爲全局/局部變量實例化,要麼通過new)。

所以,除非你將某些類型實例化爲.data/.bss節(即將它定義在函數之外,作爲該.cpp文件的全局/本地),否則無法確定變量的位置通過查看可執行文件的符號表保存。

在此代碼只打印參數的數量
+0

完整解答。金。我混合了變量和符號。謝謝! –

2

您的對象first只是一個僅存在於堆棧中的本地對象。這些對象不存儲在可執行文件的數據部分。變量second是不同的,因爲它是全球性的。它被存儲起來的初始值(默認值在你的情況下,因爲你沒有明確實例化它)並被定義爲一個符號。

-1

,ARGC是參數的數目包括命令,而argv是字符串數組這是空間分隔的命令之後的話

+0

我沒問過我寫的代碼是幹什麼的(; –

1

我認爲,爲了爲了理解readelf的輸出,我們首先需要了解一下編譯器是如何工作的。

基本上,編譯器將C/C++文件作爲輸出並生成可執行文件,每個C/C++通常由函數和變量構建。 爲了進一步理解這一點,我們還需要討論稱爲「範圍」的東西,範圍基本上是代碼中識別的地方 - 在代碼中,我們定義的對象/函數被識別並可訪問。

例如,讓我們利用這個代碼

#include <stdio.h> 

int myGlob = 5; 

int foo() 
{ 
int a = 5; 
printf("Hey this is foo -> %d\n",a + 1); 

return a + 1; 
} 

int goo() 
{ 
int b = 5; 
printf("Hey this is goo -> %d\n",b - 1); 

return b - 1; 
} 

int main() 
{ 
printf("glob(%d) foo(%d) goo(%d)",myGlob,foo() - 1, goo() +1); 

return 0; 
} 

我們有三個功能,一個全局變量

  • foo - >這裏面出現的局部變量a
  • goo - >其中有其中的局部變量b
  • main - >其中沒有局部變量wit欣它
  • 我們也有myGlob這是一個全局變量

變量a只有在它foo訪問,變量b這只是goo功能中訪問和myGlob是,但只有所有功能中訪問,所以a的範圍是foob的範圍是goomyGlob的範圍是整個模型,相當基本嗎?這就是我們在解釋中會深入一些的地方。

這些函數/ GLOBAL對象中的每一個都稱爲符號,在編寫實際代碼時,您有許多模型和許多頭文件調用幷包含對方。編譯器一次編譯一個文件,併爲每個編譯後的模型輸出一個相應的目標文件,以便允許模型識別其他模型,在每個模型中我們都包含一些稱爲符號表的東西,這個符號表基本上是所有函數和全局變量的集合在您的代碼中應該可以被其他模型訪問。

如:

  • 我們model.h定義功能foo
  • 我們model.c實現foo
  • 我們othermodel.c包括model.h定義和實施 函數foo調用goo

現在,如果我們真正創建這樣的事情,並在其上運行readelf我們會看到model.h + model .c將結合model.oothermodel.c會產生othermodel.omodel.o將有其中的符號foofoo(實際的代碼和指令的實施)和othermodel.o將有符號goofoo但只有實施foo 這哪裏是連接踢,當連接器需要的所有目標文件組合成一個可執行文件,它讀取該對象文件需要哪些內它的符號和最終我把所有的文件合併到一個可執行文件中,我再次提醒你,符號也可能是函數和全局變量。 現在我們對多個符號是什麼以及爲什麼每個符號在多個模型示波器組合使用時有了更多的瞭解,我們可以理解爲什麼局部變量不應該有它自己的符號

讓我們回到我們以前的例如,在函數foomodel.o 中有一些局部變量b,正如我們前面講過的那樣,b只能通過foo訪問,爲什麼model.o的目標文件需要生成b的符號?除foo以外的其他代碼都不能訪問該變量,那麼爲什麼需要識別或者甚至知道它的存在?

現在說實話,這是對實際發生的事情的濫用,在現實生活中,局部變量被保存在堆棧中,在您的指令代碼中,當進入某些功能時,手動操作內存棧以創建一些內存緩衝區保存與執行函數有關的所有本地變量和數據......所謂的緩衝區稱爲棧幀,其優點在於,一旦函數退出,堆棧被清除,並且通過函數重用內存,並使用本地變量和函數元數據(例如返回地址)運行堆棧內存,與本地變量不同,全局變量(例如我的示例中的myGlob或您的second)保存在全局內存部分,所有適當的函數均可訪問(實際上並不總是如此,但現在讓我們保持它這個內存的生命週期貫穿整個程序,並不像堆棧內存一樣被重寫,每個人都可以訪問它,因此局部變量不需要符號或整個生命週期程序。

如果您不知道,C++/C中的類/結構只是一堆不同類型的變量,它們依次位於內存中,如果您的類實例是本地的,它只是一堆局部變量,其他的在堆棧內存中,編譯器允許你訪問一些舒適的名字,最終將其轉換爲偏移量,因此,正如我們在前面長時間解釋的那樣,你根本不應該有一個符號對於一個局部變量..如果你想看到一個符號爲你好,你可能已經做了作爲

static int hello; 

一些諸如這或許並不會給你一個全球範圍內的無障礙尚未給出您的變量整個程序的一生..

反正希望我已清除了您出頭,對不起我的英語不好:)

編輯:

順便說一句,這絕對是有與CPU架構無關,即使您爲C++ PowerPC,MIPS或ARM編譯代碼,它也會保持不變,唯一可區分的是實際指令和函數地址,但這更像是一個概念比它與CPU架構相關