变量名、函数名

作者: 罗蓁蓁 | 来源:发表于2020-05-01 11:55 被阅读0次

C程序在执行的时候直接用内存地址去定位变量、函数,而不是根据名字去搜索,所以C程序执行的速度比脚本语言要快不少。

对于函数中的局部变量来说,编译为汇编的时候,名字就已经被彻彻底底地忘记了,因为局部变量在函数帧中,这一帧要占多少字节,各局部变量在帧中的相对位置,都在编译成汇编的时候就可以确定下来,生成目标文件、可执行文件的时候也不需要再更改。

而全局变量、static变量、函数 由于要将所有目标文件、库链接到一起之后才能最终确定它们的绝对地址,所以在链接前名字还是标志着它们的存在。

它们的信息存储在符号表(符号数组)中,其中每一项除了有符号名,还有符号地址(链接后填入),所以 nm 命令可得到 地址-符号名 映射。虽然程序运行时用不到符号表,但是默认情况下可执行文件中还是存着符号表,看下面这个程序(name.c):

#include <stdio.h>
int globalvar;
int main()
{
    static int staticval;
    return 0;
}

name.c 中有全局变量、static变量、函数(main),查看它编译后的目标文件、可执行文件的 地址-符号 映射:

[lqy@localhost notlong]$ gcc -c name.c
[lqy@localhost notlong]$ nm name.o
00000004 C globalvar
00000000 T main
00000000 b staticval.1672
[lqy@localhost notlong]$ gcc -o name name.c
[lqy@localhost notlong]$ nm name | sort
08048274 T _init
080482e0 T _start
08048310 t __do_global_dtors_aux
08048370 t frame_dummy
08048394 T main
...
此处省略X行
...
08049604 b staticval.1672
08049608 B globalvar
0804960c A _end
         U __libc_start_main@@GLIBC_2.0
         w __gmon_start__
         w _Jv_RegisterClasses
[lqy@localhost notlong]$ 

可执行文件中的 地址-符号 映射还有什么存在的意义呢?

它可用于汇编级调试的时候设置断点,比如linux内核编译后就生成了 System.map 文件,便于进行内核调试:

00000000 A VDSO32_PRELINK
00000040 A VDSO32_vsyscall_eh_frame_size
000001d3 A kexec_control_code_size
00000400 A VDSO32_sigreturn
0000040c A VDSO32_rt_sigreturn
00000414 A VDSO32_vsyscall
00000424 A VDSO32_SYSENTER_RETURN
01000000 A phys_startup_32
c1000000 T _text
c1000000 T startup_32
c1000054 t default_entry
c1001000 T wakeup_pmode_return
c100104c t bogus_magic
c100104e t save_registers
c100109d t restore_registers
c10010c0 T do_suspend_lowlevel
c10010d6 t ret_point
c10010e8 T _stext
c10010e8 t cpumask_weight
c10010f9 t run_init_process
c1001112 t init_post
c10011b0 T do_one_initcall
...

出差必备

买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP,点击注册

相关文章

  • 变量名、函数名

    C程序在执行的时候直接用内存地址去定位变量、函数,而不是根据名字去搜索,所以C程序执行的速度比脚本语言要快不少。 ...

  • PYTHON DAY04

    coding: utf-8 基础 3 ——变量名和函数名命名规则—— 变量名和函数名只能包含 字母、_下划线或数字...

  • 高阶函数

    函数名就是变量名 python定义函数其实就是定义一个类型是function的变量,函数名就是变量名。 函数也是数...

  • JavaScript 函数名的提升

    在JS中使用var 定的变量,变量名会提示,其实函数名也会提示。JavaScript 引擎将函数名视同变量名,所以...

  • Python爬虫进阶 | 细数Js加密逆向遇到的混淆类型

    eval 把一段字符串当做js代码去执行 例子: 漫画柜,空中网 变量名混淆 把变量名、函数名、参数名等,替换成没...

  • PHP函数

    function functionName() { Code } 函数名不区分大小写 函数名不能以数字开头 函...

  • 命名空间

    防止函数名或变量名相同而导致编译器无法知道要编译哪个的时候,使用命名空间来增加相同函数名或变量名的标识。 使用关键...

  • iOS底层探索之类结构

    一、前置知识 CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被...

  • GO语言学习笔记2018-09-03

    1 Go语言中函数的声明如下: func 函数名 (变量名1,变量名2 变量类型1,变量名3 变量类型2)函数返回...

  • Swift散记4 函数

    func <#name#> (参数名:参数类型 , 参数名:参数类型) - > 返回值{函数内容return} 函...

网友评论

    本文标题:变量名、函数名

    本文链接:https://www.haomeiwen.com/subject/rgnfghtx.html