源代码

#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. 并不对劲的bzoj4651:loj2084:uoj220:p1173:[NOI2016]网格

    题目大意 有一个\(n*m\)(\(n,m\leq10^9\))的网格,每个格子是空地或障碍(\(障碍数\leq10^5\)) 定义两块空地连通,当且仅当它们是"相邻的两块空地"或 ...

  2. Gerrit配置--用户配置

    环境: Gerrit Server:172.16.206.133 Client:172.16.206.129 1.在Gerrit服务器上创建用户 Gerrit服务器使用的是HTTP认证类型,并用htt ...

  3. bzoj2693

    线性筛+莫比乌斯反演 盗波图 来自candy?大神 反演很重要的一条公式就是[gcd(i,j)==1]= 线性筛怎么推呢? 我们分4个步骤,1.先推出f[1],2.推出f[p],p是一个质数,3.由于 ...

  4. linq to EF分组查询 group by 的使用

    第一种:查询表达式语法: IQueryable<EnrollmentDateGroup> data = from student in db.Students group student ...

  5. 本地测试出现:Call to undefined function curl_init()

    网上搜索Call to undefined function curl_init(),清一色的以下解决办法: 1.在php.ini中找到extension=php_curl.dll,去掉前面的,php ...

  6. 【黑金教程笔记之005】【建模篇】【Lab 04 消抖模块之二】—笔记

    实验四和实验三的区别在于输出.实验三是检测到由高到低的电平变化时就拉高输出,检测到由低到高的电平变化时就拉低输出.而实验四检测到由高到低的电平变化时产生一个100ms的高脉冲.当检测到由低到高的电平变 ...

  7. IE浏览器下错误,不能执行已释放script的代码

    错误提示: 错误原因: 我使用layui打开子页面,用到了父页面中的一个全局变量(我用的数组),子页面关闭后,使用该数组方法(如:arr.join(",")),便提示此错误 我的解 ...

  8. tyvj 1666 城市建设【最小生成树】

    -Wall是个好东西,要不然我至死都看不出来我把(b[i]+b[j])写成了(b[i],b[j])-- 还是来自lyd的题解: (其实原来课件第一行式子写错了没有-1,然而我用sai手画了一个上去hh ...

  9. bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】

    --因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...

  10. poj 3159 Candies dijkstra + queue

    题目链接: http://poj.org/searchproblem 题目大意: 飞天鼠是班长,一天班主任买了一大包糖果,要飞天鼠分发给大家,班里面有n个人,但是学生A认为学生B比自己多的糖果数目不应 ...