首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ELF文件结构描述

通常用这种方式,在ELF文件引用字符串只需给一个数字下标即可,不用考虑字符串长度问题。一般字符串标在ELF文件中国也以段方式保存,常见名为“.strtab”或“.shstrtab”。...在本目标文件引用全局符号,却没有定义在本目标文件,这一般叫做外部符号(External Symbol),也就是我们前面所讲符号引用。...这些符号并没有在你程序定义,但是你可以直接声明并引用它,我们称之为特殊符号。其实这些符号是被定义在链接器脚本,我们无须定义它们,但可以声明它们并且使用它们。...符号修饰和函数签名 在早期,编译器编译源代码产生目标文件时,符号名与相应变量和函数名字一样。...为了防止类似的符号名冲突,UNIXC语言就规定,C语言源代码文件所有全局变量和函数经过编译后,相对应符号名加上“”。

1.5K50
您找到你想要的搜索结果了吗?
是的
没有找到

认识目标文件结构

常见做法就是把字符串集中起来存放到一个表。然后使用字符串在表偏移来引用字符串; (11).rela.text,代码段重定位表存放目标文件未定义指令在链接时所需重定位信息。...其实通过符号表(Symbol Table)(下面会详细介绍)可以看到,只有 staVar1 被放在了.bss段,而 gUninitVar并没有被放在任何段,只是一个未定义 COMMON 符号。...比如 test.o 全局变量 gInitVar 在其所属.data段偏移; (b)在目标文件,如果符号是 COMMON 块类型,则 st_value 表示该符号对齐属性。...比如 test.o 全局未初始化变量 gUninitVar; (c)在可执行文件st_value 表示符号虚拟地址,这个虚拟地址对动态链接器十分有用。...一般字符串表在ELF文件也以段形式保存,常见名为“.strtab”或“.shstrtab”。

1.1K30

C语言——O动态内存管理

//一般不会返回原空间会创造出新空间 //代码2 - 先将realloc函数返回值放在p,不为NULL,在放ptr int* p = NULL; p = realloc(ptr, 1000...崩溃 六、柔性数组 也许你从来没有听说过柔性数组(flexiblearray)这个概念,但是它确实是存在。 C99,结构体最后⼀个元素允许是未知大小数组,这就叫做『柔性数组』成员。...1 和 代码2 可以完成同样功能,但是 ⽅法1 实现有两个好处: 第⼀个好处是:方便内存释放 如果我们代码是在⼀个给别⼈⽤函数,你在⾥⾯做了⼆次内存分配,并把整个结构体返回给...(其实,个⼈觉得也没多⾼了,反正你跑不了要用做偏移量加法来寻址) //示范 struct St { char c; int n; int* arr; }; int main() { //...数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。 4. 代码段:存放函数体(类成员函数和全局函数)⼆进制代码

7910

【C语言】动态内存管理

如果参数 ptr 指向空间不是动态开辟,那free函数行为是未定义。 如果参数 ptr 是NULL指针,则函数什么事都不做。 malloc和free都声明在 stdlib.h 头文件。...,就会有问题 free(p); } 在这个代码,我们如果开辟不成功,返回就是NULL,那么后面解引用p时候就会有问题。...柔性数组 也许之前从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在。 C99 ,结构最后一个元素允许是未知大小数组,这就叫做柔性数组成员。...,但是方法1实现有两个好处: 第一个好处是:方便内存释放 如果我们代码是在⼀个给别人用函数,你在里面做了二次内存分配,并把整个结构体返回给用户。...数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。 代码段:存放函数体(类成员函数和全局函数)⼆进制代码。 有错误请指出,大家一起进步吧!

10510

类和对象(上)、类定义、类访问限定符及封装、类作用域 、类实例化、类对象模型 、this指针

二、类引入 2.1 类是结构体升级 1、C语言结构体只能定义变量,在C++,结构体内不仅可以定义变量,也可以定义函数。...类体内容称为类成员:类变量称为类属性或成员变量; 类函数称为类方法或者成员函数。 类两种定义方式: 1....如何计算一个类大小? 答:一个类对象包含了该类所有成员变量实例(即状态),而成员函数则是通过对象引用(或指针)来调用共享代码。...7.2 类对象存储方式猜测 对象包含类各个成员 缺陷:每个对象成员变量是不同,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间...代码只保存一份,在对象中保存存放代码地址 只保存成员变量,成员函数存放在公共代码段 问题:对于上述三种存储方式,那计算机到底是按照那种方式来存储

5600

【C++修行之道】类和对象(三)拷贝构造函数

} 在上述代码,Date 类并没有显式定义拷贝构造函数。...当代码尝试通过已有的 Date 对象 d1 来拷贝构造一个新 Date 对象 d2 时,由于没有找到用户定义拷贝构造函数,编译器会自动为 Date 类生成一个默认拷贝构造函数。...这就是为什么在上述代码,即使没有显式编写拷贝操作,仍然可以看到 Time 类拷贝构造函数被调用输出。...MyQueue类成员变量:每个MyQueue对象都包含两个Stack对象,因此当q1和q2销毁时,它们四个Stack成员变量(q1._st1, q1._st2, q2._st1, q2....有一点需要注意:如果MyQueue类没有定义拷贝构造函数,并且默认使用了浅拷贝(即只拷贝成员变量值,而不是它们所指向内容),那么q2_st1和_st2实际上只是q1对应成员简单复制(指针或引用复制

6310

javaScript代码飘红报错看不懂?读完这篇文章再试试!

):使用了未定义变量。...// 1、变量未定义便直接使用 console.log(my); // 报错:Uncaught ReferenceError: my is not defined // 翻译:my未定义 // 2、将变量赋值给一个无法被赋值东东...4、不管有没有异常,finally代码都会在try和catch之后执行 try{ throw new Error("出现异常了"); }catch (err) { // 错误相关信息...哪怕你有return,也会执行! console.log("不管有没有异常,都会执行。哪怕你有return,也会执行!") } console.log("还会继续运行哦!!")...•使用try包裹代码,即使不出错,效率也比不用try包裹代码低。•在try,尽量少包含可能出错代码。•无法提前预知错误类型错误,必须用try catch捕获。•finally可以省略。

5.4K20

Python + Steamlit 快速开发可视化 web 页面!

用Python做web图形用户界面,最先想到是Flask、Djong等框架。然而研究这些对于初学者来讲,尤其是没有web开发基础数据分析人员是痛苦。...幸运是,Python也有很多第三方库来快速进行简单web可视化,例如之前介绍 PyWebIO 今天再介绍一个 Steamlit,可以快速利用简单代码快速布局自己想要web界面!...3.7或以上,同时设置好环境变量,这里默认读者都已经设置好不细讲。...st.title('第一个MLweb') 保存这个py文件,命名为test.py,利用我们第一部分讲解如何运行代码,在命令窗口输入streamlit run test.py。...注意,这里直接用 streamlit 是已经调好了环境变量,如果不想调,打开 streamlit 源程序文件,将streamlitexe文件调用即可。

2.6K20

类和对象 _ 剖析构造、析构与拷贝

一、构造函数 构造函数是特殊成员函数,它在创建对象时自动调用。其主要作用是初始化对象成员变量(不是开辟空间)。构造函数名字必须与类名相同,且没有返回类型(即使是void也不行)。...但是,需要注意是,如果我们不在无参构造函数初始化成员变量,那么这些变量初始值将是未定义,这可能会导致程序出错。...带参构造函数可以在对对象进行初始化时候进行传参,传参数值会直接进行初始化对象成员变量。...默认拷贝构造函数执行是浅拷贝,即简单地将每个成员变量值从原始对象复制到新对象。...Stack func() { Stack st; return st; } ②与①进行对比,没有返回对象引用,所以程序可以正常运行, 这个函数返回一个Stack对象。

10010

【c++】类和对象(六)深入了解隐式类型转换

然而,对于自动存储持续时间(如函数内局部变量对象,如果未显式初始化,则其值是未定义。...而_year、_month、和_day虽然没有在初始化列表中被显式赋值,但它们会在构造函数体开始执行前完成默认初始化(对于基本数据类型,这意味着它们初始值是未定义)。...这意味着当_a2(_a1)执行时,_a1还没有被初始化,所以_a2值是未定义。...在实际执行时,未定义值可能是内存该位置任何值,这取决于编译器和运行时环境。 要修正这个问题,应该按照成员变量在类声明顺序初始化它们,或者更改成员变量声明顺序以反映期望初始化顺序。...这种转换使得单个值可以被视为是该类一个实例,即使没有显式地调用构造函数 C cc1(1); 这行代码直接调用了C类构造函数,使用1作为参数创建了cc1对象。

19410

有了这个开源项目,不会 Web 开发也能让数据“动”起来!

2.1 开发自己 app 1、首先创建一个 Python 文件,命名为 test.py,导入 Streamlit 库。...数学表达式 st.code() 显示带有可选语法高亮显示代码块 ?...2.2.2「魔法」 愿称之为懒人命令——用尽量少代码达到同样效果。在不调用任何 Streamlit 方法情况下,当用户自定义变量出现在单行,等同于 st.write() 效果。...如果发现这三个值组合第一次出现,则会运行函数,并且将结果存储在本地缓存。当下次调用该函数时,如果这三个值没有改变,则 Streamlit 会跳过函数执行,直接读取本地缓存返回结果。...更多详情还需要友友们在实践探索,并将指令成功“嵌入”到自己项目中。

2.2K30

【Rust 易学教程】第 1 天:Rust 基础,基本语法

今天,我们正式进入 Rust 基础学习。在本文内容,我会为大家介绍以下内容: 基本 Rust 语法: 变量、标量和复合类型、枚举、结构、引用、函数和方法。...; } 从上面的代码,我们看到 rust 代码具有如下一些特征: 函数由 fn 引入。 像 C 和 c++ 一样,块由花括号分隔。 main 函数是程序入口点。...缺少未定义运行时行为。 现代语言特点。例如,可以获得像 C和c++ 那样快速且可预测性能(没有垃圾收集器)以及访问低级硬件。...编译时验证 编译时静态内存会进行如下验证: 验证没有未初始化变量。 验证没有内存泄漏。 验证没有 double-frees。 验证 use-after-free。 验证 NULL 指针。...验证忘记锁定互斥锁。 验证线程之间没有数据竞争。 验证迭代器是否失效。 运行时验证 以下行为将会判定为是在运行时无未定义行为: 检查数组访问边界。

28220

Linux之多线程编程实例

未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们在主线程更改了我们全局变量a时候,我们新建立线程则打印出来了改变值,可以看出可以访问线程所在进程数据信息...代码如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建线程没有机会开始执行就结束了。...c->a = 8   c->b = xiaoqiang   fs@ubuntu:~/qiang/thread$   例程总结:   一定要记得返回数据结构要是在这个数据要返回结构没有释放时候应用,...,函数说明   例程8   程序目的:实现在新建立线程打印该线程id和进程id   代码如下: #include #include #include/*getpid()*/   void *create

1.5K10

Linux多线程实例解析

未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们在主线程更改了我们全局变量a时候,我们新建立线程则打印出来了改变值,可以看出可以访问线程所在进程数据信息...代码如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建线程没有机会开始执行就结束了。...c->a = 8   c->b = xiaoqiang   fs@ubuntu:~/qiang/thread$   例程总结:   一定要记得返回数据结构要是在这个数据要返回结构没有释放时候应用,...,函数说明   例程8   程序目的:实现在新建立线程打印该线程id和进程id   代码如下:   #include   #include   #include/*getpid()*/   void

1.5K20

《程序员自我修养》第三章学习笔记

有时也叫段(segment) 2,  代码段常见名字有 “.code”  “.text”,编译后机器指令就放在代码段, 数据段:一般名字都是 “.data”,已初始化全局变量和局部静态变量数据放这...描述文件各个段数组(各个段在文件偏移和属性)。 5,  关于bss段:未初始化全局变量和静态局部变量一般放在一个”.bss”段地方。...它只是为未初始化全局变量和静态局部变量预留位置而已,并没有内容,在文件不占空间。 6,  总体来说:程序源代码被编译后主要分成两种段:程序指令(代码段),程序数据(数据段,bss段)。...3.5.2 特殊符号 1,ld链接器产生可执行文件时,会给我们定义很多符号(没有在自己程序定义),但是可以直接声明并且引用它,我们称之为特殊符号。...5,弱引用与强引用: 强引用:假如链接时没找到该符号定义,链接器就会报符号未定义错误。 弱引用:假如链接时没找到该符号定义,链接器不会报错,默认其为0或是一个特殊值。

1.1K60

动态内存管理详解

如果参数ptr指向空间不是动态开辟,那free函数是未定义。、 如果参数ptr是NULL指针,则函数什么都不做。 需要注意是两者都是声明在stdlib.h头文件。...//代码2 - 先将realloc函数返回值放在p,不为NULL,在放ptr int*p = NULL; p = realloc(ptr, 1000); if(p !...示例: typedef struct st_type { int i; int a[0]; }type_a; 5.1柔性数组特点 结构体柔性数组成员前面必须至少一个其他成员。...,但是方法1实现有两个好处: 1.方便内存释放 如果我们代码是在一个给别人用函数,你在里面做了二次内存分配,并把整个结构体返回给用户。...数据段(静态区)(static)存放全局变量,静态数据。程序结束后由系统释放。 代码段:存放函数体)(类似成员变量和全局函数)二进制代码

9510

Linux多线程编程实例解析

未定义引用   collect2: ld 返回 1   此例子介绍了创建线程方法   下面例子介绍向线程传递参数。   ...fs@ubuntu:~/qiang/thread$   例程总结:   可以看出来,我们在主线程更改了我们全局变量a时候,我们新建立线程则打印出来了改变值,可以看出可以访问线程所在进程数据信息...代码如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建线程没有机会开始执行就结束了。...c->a = 8   c->b = xiaoqiang   fs@ubuntu:~/qiang/thread$   例程总结:   一定要记得返回数据结构要是在这个数据要返回结构没有释放时候应用,...,函数说明   例程8   程序目的:实现在新建立线程打印该线程id和进程id   代码如下:   #include   #include   #include /*getpid()*/   void

2.3K40
领券