Linux C下变量和常量的存储的本质
源代码
#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下变量和常量的存储的本质的更多相关文章
- 在Linux虚拟机下配置jdk的环境变量
1.到Oracle公司的官网里下载好jdk,网址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...
- Linux系统下配置环境变量
一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...
- Linux系统下配置JDK环境变量
刚申请了阿里云,平时很少接触Linux,特此记录一下Linux系统下安装JDK的步骤. 1.进入usr:cd /usr: 2.创建java文件夹:mkdir java: 3.将下载好的文件拷贝至jav ...
- LINUX系统下添加映射存储LUN
LINUX系统下添加映射存储LUN(无需重启) 背景:Oracle rac环境 添加新实例,重新划分存储空间,从存储映射新的LUN. 问题:映射后,linux操作系统无法识别新的LUN,不能重启系统, ...
- Linux系统下修改环境变量PATH路径的三种方法
这里介绍Linux的知识,比如把/etc/apache/bin目录添加到PATH中有三种方法,看完之后你将学会Linux系统下如何修改环境变量PATH路径,需要的朋友可以参考下 电脑中必不可少的就是操 ...
- Java入门——在Linux环境下安装JDK并配置环境变量
Java入门——在Linux环境下安装JDK并配置环境变量 摘要:本文主要说明在Linux环境下JDK的安装,以及安装完成之后环境变量的配置. 使用已下载的压缩包进行安装 下载并解压 在Java的官网 ...
- 如何在linux环境下配置环境变量
jdk下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 在linux环 ...
- linux系统下以存储从大到小并以K,M,G为单位的方式查看当前目录下的文件信息
zhuazai:https://blog.csdn.net/sty945/article/details/79830915 前言 ls命令 ls -a ls -l ll du命令 du -s du - ...
- 在Linux系统下安装jdk并配置环境变量
本文主要介绍的是如何是Linux环境下安装JDK的,因为Linux环境下,很多时候也离不开Java的,下面笔者就和大家一起分享如何jdk1.8的过程吧. 1.安装环境 操作系统:CentOS 07 6 ...
随机推荐
- 【Jsoi2010】连通数
[题目链接] 点击打开链接 [算法] 直接暴力dfs一遍,即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN ...
- mybatis 基础详解
转 https://www.cnblogs.com/Mr-Kenson/p/8124680.html mybatis 是一个开源的 用于对数据库操作的框架, 读者基本都大体了解其基本功能, 我就不多解 ...
- Tomcat配置JVM运存
setenv.bat set "JAVA_OPTS=-server -Xms256M -Xmx1024M -XX:PermSize=256m -XX:MaxPermSize=1024m&qu ...
- P5106 dkw的lcm
传送门 终于A了--细节真多-- 首先我们发现这是个连乘,而且\(\phi\)是个积性函数,所以我们可以考虑不同的质因子以及它的不同次数的贡献.简单来说就是把每一次的\(\phi(lcm(i_1,i_ ...
- 【牛客-14602】xinjun与阴阳师(01背包)
xinjun与阴阳师 题目描述 xinjun是各类手游的狂热粉丝,因随手一氪.一氪上千而威震工大,现在他迷上了阴阳师.xinjun玩手游有一个习惯,就是经过层层计算制定出一套方案来使操作利益最大化(因 ...
- IE6 position:fixed bug hack方式
/* IE6浏览器的特有方法 */ /* 修正IE6振动bug */ * html,* html body{background-image:url(about:blank);background-a ...
- nginx_uWSGI_django_virtualenv_supervisor发布web服务器
nginx_uWSGI_django_virtualenv_supervisor发布web服务器 nginx 导论 123456789101112131415161718192021222324252 ...
- django 第一个项目测试
我们安装好Django以后就可以使用Django命令来创建项目了 1.Django 创建第一个项目 安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py.我们可以 ...
- Codeforces Round #459 (Div. 2)C. The Monster
C. The Monster time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- magento 添加事件
首先是配置文件config.xml里的配置 <checkout_cart_save_after> /*事件名字*/ <observers> <deal> /*模块名 ...