源代码

#cat main.c
#include <stdio.h> int i = 100; int main(void)
{
func();
return 0;
}
#cat func.c
#include <stdio.h> extern i; int yyyy;
char *s1 = "hello world\n"; int func()
{
static int j = 200;
static int wwwww = 300;
printf("i:%d\n",i);
printf("wwww:%d\n",wwwww);
return 0;
}
gcc -o main func.c main.c

变量的存储

变量s1 存储在 .data里;

#readelf -s main
61: 0000000000601050 0 NOTYPE GLOBAL DEFAULT 25 _end
62: 0000000000400440 0 FUNC GLOBAL DEFAULT 13 _start
63: 0000000000601038 8 OBJECT GLOBAL DEFAULT 24 s1
64: 0000000000601034 4 OBJECT GLOBAL DEFAULT 24 i
#readelf -S main
[23] .got.plt PROGBITS 0000000000601000 00001000
0000000000000030 0000000000000008 WA 0 0 8
[24] .data PROGBITS 0000000000601030 00001030
0000000000000018 0000000000000000 WA 0 0 8
[25] .bss NOBITS 0000000000601048 00001048

常量的存储

hello world 存储在哪里? 我们知道是 rodata里,看看位置吧:

#objdump -d -j .rodata main

main:     file format elf64-x86-64

Disassembly of section .rodata:

0000000000400600 <_IO_stdin_used>:
400600: 01 00 02 00 00 00 00 00 ........ 0000000000400608 <__dso_handle>:
...
400610: 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a 00 69 3a 25 hello world..i:%
400620: 64 0a 00 77 77 77 77 3a 25 64 0a 00 d..wwww:%d..

结合反汇编

#objdump -D main > main.s

这里看到s1的位置是601038 , 查看main.s

#readelf -s main
61: 0000000000601050 0 NOTYPE GLOBAL DEFAULT 25 _end
62: 0000000000400440 0 FUNC GLOBAL DEFAULT 13 _start
63: 0000000000601038 8 OBJECT GLOBAL DEFAULT 24 s1
64: 0000000000601034 4 OBJECT GLOBAL DEFAULT 24 i
#vim main.s
0000000000601038 <s1>:
601038: 10 06 adc %al,(%rsi)
60103a: 40 00 00 add %al,(%rax)
60103d: 00 00 add %al,(%rax)
...

const 全局变量

const 可以将变量存储在哪里? - rodata

这里,应该明白 const修饰后的变量,存储在rodata段,自然不能更改;

指针本质

#cat main.c
#include <stdio.h> int i = 10;
int *p = &i; int func(void)
{
return 0;
} int main(void)
{
i = 20;
*p = 30;
return 0;
}
#gcc -o main  main.c

汇编:

#objdump -D main > main.s

查看符号表:

func函数的地址是:4004ed, 知道这个地址后,看汇编代码

#readelf -s main
54: 00000000004005a8 0 OBJECT GLOBAL HIDDEN 15 __dso_handle
55: 00000000004005a0 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used
56: 00000000004004ed 11 FUNC GLOBAL DEFAULT 13 func
57: 0000000000400520 101 FUNC GLOBAL DEFAULT 13 __libc_csu_init
58: 0000000000601048 0 NOTYPE GLOBAL DEFAULT 25 _end
59: 0000000000400400 0 FUNC GLOBAL DEFAULT 13 _start

其实,看到汇编,可以明白,一个函数名,也是一个地址;

#vim main.s
00000000004004ed <func>: // 函数名func 的地址是4004ed
4004ed: 55 push %rbp
4004ee: 48 89 e5 mov %rsp,%rbp
4004f1: b8 00 00 00 00 mov $0x0,%eax
4004f6: 5d pop %rbp
4004f7: c3 retq 00000000004004f8 <main>:
4004f8: 55 push %rbp
4004f9: 48 89 e5 mov %rsp,%rbp
4004fc: c7 05 2a 0b 20 00 14 movl $0x14,0x200b2a(%rip) # 601030 <i>
400503: 00 00 00
400506: 48 8b 05 2b 0b 20 00 mov 0x200b2b(%rip),%rax # 601038 <p>
40050d: c7 00 1e 00 00 00 movl $0x1e,(%rax)
400513: b8 00 00 00 00 mov $0x0,%eax
400518: 5d pop %rbp
400519: c3 retq
40051a: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)```

Linux C下变量和常量的存储的本质的更多相关文章

  1. 在Linux虚拟机下配置jdk的环境变量

    1.到Oracle公司的官网里下载好jdk,网址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  2. Linux系统下配置环境变量

    一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...

  3. Linux系统下配置JDK环境变量

    刚申请了阿里云,平时很少接触Linux,特此记录一下Linux系统下安装JDK的步骤. 1.进入usr:cd /usr: 2.创建java文件夹:mkdir java: 3.将下载好的文件拷贝至jav ...

  4. LINUX系统下添加映射存储LUN

    LINUX系统下添加映射存储LUN(无需重启) 背景:Oracle rac环境 添加新实例,重新划分存储空间,从存储映射新的LUN. 问题:映射后,linux操作系统无法识别新的LUN,不能重启系统, ...

  5. Linux系统下修改环境变量PATH路径的三种方法

    这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...

  6. Java入门——在Linux环境下安装JDK并配置环境变量

    Java入门——在Linux环境下安装JDK并配置环境变量 摘要:本文主要说明在Linux环境下JDK的安装,以及安装完成之后环境变量的配置. 使用已下载的压缩包进行安装 下载并解压 在Java的官网 ...

  7. 如何在linux环境下配置环境变量

    jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在linux环 ...

  8. linux系统下以存储从大到小并以K,M,G为单位的方式查看当前目录下的文件信息

    zhuazai:https://blog.csdn.net/sty945/article/details/79830915 前言 ls命令 ls -a ls -l ll du命令 du -s du - ...

  9. 在Linux系统下安装jdk并配置环境变量

    本文主要介绍的是如何是Linux环境下安装JDK的,因为Linux环境下,很多时候也离不开Java的,下面笔者就和大家一起分享如何jdk1.8的过程吧. 1.安装环境 操作系统:CentOS 07 6 ...

随机推荐

  1. poj3046 Ant Counting——多重集组合数

    题目:http://poj.org/problem?id=3046 就是多重集组合数(分组背包优化): 从式子角度考虑:(干脆看这篇博客) https://blog.csdn.net/viphong/ ...

  2. hdu3709 (平衡数) 数位DP

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  3. Uncaught ReferenceError: is not defined

    今天,遍历一个HashSet集合对象,想用链接绑定集合对象的值,通过POST方式提交到控制器.结果程序无反应,按F12键进入调试模式,谷歌总是提示Uncaught ReferenceError:   ...

  4. bzoj 4071: [Apio2015]巴邻旁之桥【splay】

    用权值线段树会容易一些并快一些,但是想复健一下splay所以打了splay 然后果然不会打了. 解题思路: 首先把家和办公室在同一侧的提出来直接加进答案里: 对于k=1,直接选所有办公室和家的中位数即 ...

  5. 状压入门--bzoj1087: [SCOI2005]互不侵犯King【状压dp】

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...

  6. Workflow 规则大全 最新版

    ​对于怎么操作Workflow我就不重复说明了 大家可以搜索我的另一条微博.Workflow,作为一款提高效率的软件,我觉得很有必要进行推广,当然我比较需要这里面的很多规则,先为己再为公.首先我只是出 ...

  7. JavaScript 编程艺术-第4章(JavaScript美术馆)代码

    功      能:在同一个网页上切换显示不同的图片与文本(*亲测可用) 使用属性: a) document.getElementById(" ") ——返回一个与给定的id属性值的 ...

  8. Unix\Linux | 总结笔记 | 邮件发送

    实验:在本地实现不同用户收发邮件 #root发送邮件 #stu 收邮件 #stu 查看邮件 并回复邮件 #root 查看stu回复的邮件

  9. /bin,/sbin,/usr/sbin,/usr/bin 目录之简单区别

    /bin,/sbin,/usr/sbin,/usr/bin 目录 这些目录都是存放命令的,首先区别下/sbin和/bin: 从命令功能来看,/sbin 下的命令属于基本的系统命令,如shutdown, ...

  10. Qt对象模型之二:对象树与元对象系统

    一.对象树的概念 Qt中使用对象树(object tree)来组织和管理所有的QObject类及其子类的对象.当创建一个QObject时,如果使用了其他的对象作为其父对象(parent),那么这个 Q ...