首页
学习
活动
专区
圈层
工具
发布

gcc编译时,链接器安排的【虚拟地址】是如何计算出来的?

作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++、嵌入式、Linux。...例如下面这段C代码: 首先编译出32位的可执行程序(为了避开一些与主题无关的干扰因素,采用了静态链接): gcc -m32 -static test.c -o test 编译得到ELF格式的可执行文件...很久之前总结过这篇文章:《Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索》,里面详细总结了ELF文件的内部结构。...这里就不再赘述了,只要记住2点: 从编译器的角度看,ELF 文件是由很多的节(Section)组成的; 从程序加载器的角度看,ELF 文件是又很多的段(Segment)组成的; 其实它俩没有本质区别,只不过是链接器在链接阶段...再来看一下代码段的虚拟地址:在执行gcc指令的的时候,链接器把代码段的虚拟地址安排在0x0804_8000处: 也就是说:当CPU中(或者说程序代码中),使用0x0804_8000 ~ 0x0804_

1.7K41

在ubuntu安装的软件在哪里找_ubuntu如何安装gcc编译器

在命令行安装: 3. 在命令行执行: 二、汉化 在ubuntu中用vscode编译调试C\C++ 一、 安装插件 二、编译运行程序 在ubuntu安装vscode 一、命令安装 1....在命令行安装: sudo dpkg -i code_1.51.0-1604600753_amd64.deb (如果出现错误,提示:dpkg: 处理软件包XXX时出错:依赖关系问题,仍未被配置 使用如下命令...在命令行执行: code 二、汉化 在ubuntu中用vscode编译调试C\C++ 一、 安装插件 1.安装vscode的C\C++插件 在搜索框上输入C/C++,并下载,等待安装完成 2....安装vscode的Code Runner插件 在搜索框上输入Code Runner,并下载,等待安装完成 二、编译运行程序 使用之前安装好的Code Runner插件一键编译运行程序 点击:...发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192394.html原文链接:https://javaforall.cn

2.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux】Linux:sudo 白名单配置与 GCCG++ 编译器使用指

    【就像这样的场景】: 【如何将普通用户加入白名单】: 由于sudoers文件的拥有者是root所以得使用root用户添加,切换root账号,打开ect目录下的sudoers文件,在图片黄色格子圈的地方,...三、GCC 与 G++ 的本质区别 GCC:是 GNU 编译器集合的总称,支持 C、C++、Java、Fortran 等多种语言,当编译 C 代码时,它会自动调用 C 编译器。...核心差异:编译 .c 文件时,GCC 会默认按 C 语言语法处理,而 G++ 会默认按 C++ 语法处理;编译 .cpp 文件时,两者都会按 C++ 语法处理,但 G++ 会自动链接 C++ 库,GCC...例如,若程序链接了静态数学库,编译后库代码直接 “打包” 进程序,在无对应库的环境中也能运行。 【动态库】: 定义:编译链接时仅记录库引用,程序运行时由运行时链接器加载库。...【debug 与 release 构建】 debug 构建:编译时添加 -g 选项(如 gcc -g hello.c -o hello_debug),生成的程序包含调试信息,可通过 GDB(gdb hello_debug

    22510

    云课五分钟-0Cg++默认版本和升级-std=c++17

    g++通常对新的C++标准支持较好,而较旧的gcc版本可能只支持较旧的C++标准。 编译器选项: 尽管g++和gcc共享很多编译器选项,但它们也有一些独特的选项。...例如,g++有一些针对C++特性的选项,而gcc有针对C语言的选项。因此,在编译时,需要根据编译的语言选择合适的编译器选项。 调试信息: 在编译时,你可能希望添加调试信息,以便于后续的调试工作。...当然,还有一些关于g++和gcc的重要话题可以继续: 编译器优化: 无论是gcc还是g++,都提供了一系列的优化选项。这些选项可以帮助开发者在编译时对代码进行优化,以提高程序的运行效率。...两者都可以编译C和C++代码,但在编译C++代码时,g++会链接C++标准库,而gcc则不会。...g++会自动链接C++标准库。 通过这个例子,你可以看到gcc和g++在处理C++代码时的区别。虽然它们都可以编译C++代码,但g++在编译时会链接C++标准库,这使得编译C++代码时更为方便。

    2.4K40

    解决:无法解析的外部符号__iob_func

    解决: 无法解析的外部符号 __iob_func在使用C/C++编程语言进行项目开发时,有时可能会遇到编译错误,其中一个常见的错误是无法解析的外部符号__iob_func。...在默认情况下,C/C++编译器使用标准库函数(如stdio.h中的函数)来处理输入输出操作。然而,如果链接器无法找到这些函数的实现,就会导致编译错误。...如果路径不正确,可以使用以下命令来添加正确的路径:bashCopy code-L /path/to/libc3. 检查链接器选项检查链接器选项是否正确配置。链接器在链接时需要找到标准库函数的实现。...如果路径不正确,可以使用以下命令添加正确的路径:bashCopy code-L /path/to/libc检查链接器选项:在编译命令中添加以下选项,以确保链接器能够正确找到标准库函数的实现:bashCopy...编译器文档:查阅编译器的官方文档,该文档通常包含了关于如何检查版本的信息。在命令行上运行编译器可执行文件时,可能会显示版本信息或者与版本相关的信息。

    2.1K10

    【Linux】gcc&g++与 的美妙邂逅(5)

    一.底层知识点 引入:在我们在Window或者Linux系统上进行C/C++及其它形式的开发时,我们可能会有这样的疑问————这一过程是如何得以实现的?...vscode等编译器时,我们会发现,其会让我们选择对应的开发包,其中就包括C的头文件和库文件 二.函数库 1.库的基础知识 引入: 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的...gcc 是GNU Compiler Collection,原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C、C++、Objective-C、Ada、Fortran...gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。...【-static】选项&【动静态库细节】 在Linux中,如果要按照静态链接的方式进行形成可执行程序,需要添加【-static选项】(提供静态库) ,例如 gcc mycode.c -o mycode

    48910

    C++系列-附录-windows下安装C++环境

    使用-I选项指定包含头文件的目录,-L选项指定包含库文件的目录,-l选项指定要链接的库文件。...使用-g选项生成调试信息,以便在调试时使用。 这些命令示例展示了在MinGW环境下使用g++编译器的一些常见用法。请注意,具体的命令选项和用法可能会因MinGW版本和个人设置而有所不同。...MinGW 的目标是在 Windows 环境中提供一个开发环境,使开发者能够使用 GCC 编译器来编译和构建 C++ 程序。为了实现这一目标,MinGW 采用了 GCC 的命令行界面和选项。...这使得在 Windows 环境中进行 C++ 开发时,可以直接迁移和使用熟悉的 GCC 命令,而无需额外学习其他特定于 Windows 的工具和命令。...因此,在使用 MinGW 命令时,仍然建议参考 MinGW 的文档和资源,以确保正确理解和使用命令的特定行为和选项。

    1.4K10

    gcc和g++是什么,有什么区别?

    但本教程主要讲解如何使用 GCC 编译器编译运行 C 和 C++ 程序,因此有关其它编程语言如何使用 GCC 编译器编译,将不再做具体讲解。...那么,在已编辑好 C 语言或者 C++ 代码的前提下,如何才能调用 GCC 编译器为我们编译程序呢?...很简单,GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器。...要知道,很多 C++ 程序都会调用某些标准库中现有的函数或者类对象,而单纯的 gcc 命令是无法自动链接这些标准库文件的。...如果想使用 gcc 指令来编译执行 C++ 程序,需要在使用 gcc 指令时,手动为其添加 -lstdc++ -shared-libgcc 选项,表示 gcc 在编译 C++ 程序时可以链接必要的 C+

    1.5K10

    【linux学习指南】Linux编译器 gcc和g++使用

    前言 预处理(进行宏替换) 编译(生成汇编) 汇编(生成机器可识别代码) 连接(生成可执行文件或库文件) gcc如何完成 格式 :gcc [选项] 要编译的文件 [选项] [目标文件] 预处理(进行宏替换...实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。...它能够正确处理 C++ 的语法、特性和标准库。 默认链接 gcc:在编译 C 代码时,默认链接 C 标准库。...g++:在编译 C++ 代码时,默认链接 C++ 标准库(如 libstdc++),这对于使用 C++ 标准库的程序是必要的。...g++ 能够处理 C++ 的特性,如类、模板、异常处理等,而 gcc 在处理这些特性时可能会出现错误或警告。

    1.1K10

    CC++生态工具链——gccg++编译器使用指南

    而g++只把xxx.c和xxx.cpp一律都当作C++语言来编译。 在编译C++文件的时候,g++会自动链接一些标准库或基础库,而gcc不会。...GCC在链接时优先使用动态库,只有当动态库不存在时才开始使用静态库,如果要强制使用静态库,编译时加上-static参数。 使用-Wl,-Bstatic告诉链接器优先使用静态库。...正因为这种链接方式,共享库每次被更新时,都不需要重新编译正在使用共享库的目标程序。 使用-Wl,-Bdynamic告诉链接器优先使用动态库。...格式的文件 -static #生成静态库,库文件格式为xxx.a格式的文件 -Wl #告诉编译器将后面的参数传递给链接器 -Wl,-Bstatic #-Bstatic选项用于对指定的库静态连接..., 一般和 -I 联合使用,明确限定头文件的位置 -nostdin C++ #规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建libg++库使用 优化参数 -O0 #不优化

    3.6K31

    C++ 环境设置

    在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 C++ 编译器 写在源文件中的源代码是人类可读的源。...以下部分将指导您如何在不同的操作系统上安装 GNU 的 C/C++ 编译器。这里同时提到 C/C++,主要是因为 GNU 的 gcc 编译器适合于 C 和 C++ 编程语言。...一旦安装上 Xcode,您就能使用 GNU 编译器。 Windows 上的安装 为了在 Windows 上安装 GCC,您需要安装 MinGW。...默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。...通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示: $ gcc main.cpp -lstdc++ -o main 下面是一个保存在文件 helloworld.cpp

    3.2K51

    配置C++的学习环境

    C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。...以下部分将指导您如何在不同的操作系统上安装 GNU 的 C/C++ 编译器。这里同时提到 C/C++,主要是因为 GNU 的 gcc 编译器适合于 C 和 C++ 编程语言。...添加您安装的 MinGW 的 bin 子目录到您的 PATH 环境变量中,这样您就可以在命令行中通过简单的名称来指定这些工具。...默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。...通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示: $ gcc main.cpp -lstdc++ -o main 下面是一个保存在文件 helloworld.cpp

    1.3K10

    如何进行内存设置

    在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 C++ 编译器 写在源文件中的源代码是人类可读的源。...以下部分将指导您如何在不同的操作系统上安装 GNU 的 C/C++ 编译器。这里同时提到 C/C++,主要是因为 GNU 的 gcc 编译器适合于 C 和 C++ 编程语言。...添加您安装的 MinGW 的 bin 子目录到您的 PATH 环境变量中,这样您就可以在命令行中通过简单的名称来指定这些工具。...默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。...通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示: $ gcc main.cpp -lstdc++ -o main 下面是一个保存在文件 helloworld.cpp

    2.8K20

    如何进行环境配置

    在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 C++ 编译器 写在源文件中的源代码是人类可读的源。...以下部分将指导您如何在不同的操作系统上安装 GNU 的 C/C++ 编译器。这里同时提到 C/C++,主要是因为 GNU 的 gcc 编译器适合于 C 和 C++ 编程语言。...添加您安装的 MinGW 的 bin 子目录到您的 PATH 环境变量中,这样您就可以在命令行中通过简单的名称来指定这些工具。...默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。...通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示: $ gcc main.cpp -lstdc++ -o main 下面是一个保存在文件 helloworld.cpp

    2.6K20

    mac 使用Clang(Next-gen compiler infrastructure)配置VS Code CC++环境

    差别 就是标准库,例如 stl 用到数据结构和算法 gcc hello.cpp -lstdc++ 如果想使用 gcc 指令来编译执行 C++ 程序,需要在使用 gcc 指令时,手动为其添加  -lstdc...++ 选项,表示 gcc 在编译 C++ 程序时可以链接必要的 C++ 标准库 该程序中使用了标准库  和  提供的类对象,而 gcc 默认是无法找到它们的 提问:...编译器支持: libstdc++是GNU编译器套件(GCC)的默认C++标准库实现, 而libc++是LLVM编译器套件的默认C++标准库实现。...gcc参数 -I/usr/include ,大写的I Makefile选项LDFLAGS 指定库文件的位置 gcc参数LDFLAGS=-L/usr/lib 大写L LIBS:告诉链接器要链接哪些库文件,...链接器调用日志显示了它如何将目标文件与标准库链接(包括 libc++ 和 libSystem),并使用 -syslibroot 指定了 macOS 的系统库路径。

    2.3K10

    gcc基本命令_cmake 命令

    GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC 不仅可以编译 C、C++ 和 Objective-C,还可以通过不同的前端模块支持各种语言,包括 Java、Fortran...Linux 程序员可以根据自己的需要控制 GCC 的编译阶段,以便检查或使用编译器在该阶段的输出信息,帮助调试和优化程序。以 C 语言为例,从源文件的编译到可执行文件的运行,整个过程大致如下。...-no-canonical-prefixes :在构建其他 gcc 组件的相对前缀时,不要规范化路径。 -pipe :使用管道而不是中间文件。 -time :为每个子流程的执行计时。...-B :将 添加到编译器的搜索路径。 -v :显示编译器调用的程序。 -### :与 -v 类似,但引用的选项和命令不执行。...这里在链接时使用 -Wl,-rpath=/path/to/yours 选项,-Wl 会发送以逗号分隔的选项到链接器,注意逗号分隔符后面没有空格哦。

    1K40

    Linux从入门到精通(九)——Linux编程

    其中,第一行指令用于安装编译 C 和 C++ 代码所需的静态链接库;第二行指令用于安装编译 C 和 C++ 代码的 gcc 和 g++ 指令。...gcc的选项,-E可以使编译器在预处理结束时就停止编译,生成.i文件(作用:把头文件嵌入) gcc -E -o [目标文件] [编译文件] # 例如 gcc -E -o hello.i hello.c...-o file将file文件指定为输出文件-v打印出编译器内部编译各过程的命令行信息和编译器的版本-I dir指明头文件所在位置,在头文件的搜索路径列表中添加dir目录 默认情况下标准头文件存放位置:/...进行动态编译,尽可能地链接动态库,只有当没有动态库时,才会链接同名的静态库。...6.1 gdb 基本用法 ​ 需要调试的程序,在编译时要使用调试选项。在默认的情况下,调试符号不会编译到程序中。调试之后,不需要重新编译程序。

    2.7K30

    深入浅出GCC编译器

    本文将带你迈入GCC的大门,了解一个C源文件是如何在GCC编译工具链的加工下成为一个可执行性文件的,并详细讲解GCC编译参数以及可能会用到的其他知识。...通过下面的命令可以查看GCC版本和GCC的安装路径。 gcc -v which gcc C语言编译器是gcc-core,C++语言编译器是gcc-c++。 2..../**/),一般会用一个空格来代替连续的注释; 添加行号和文件标识,以便于编译时编译器产生调试用的行号信息及编译时产生编译错误和警告时可以把行号打印出来; 保留所有的#pragma编译器指令; 处理预定义的宏...编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符号,比如全局变量或者调用了某个库函数中的函数,那么这时候,在这个文件中该符号的地址是没法确定的,只能由链接器把所有的目标文件链接到一起才能确定最终的地址...(9)-lstdc++ 编译C++源文件 直接用gcc编译C++源文件,是无法编译的 编译C++源文件有两种方法,一种是使用 -lstdc++ 选项,另一种是使用 g++ 编译。

    2.4K10

    【详解】生成JNI的DLL时提示找不到jni.h的解决办法Cannotopenincludefile:jni.h:Nosuchfileordirectory

    在编译C/C++代码以生成动态链接库(DLL)时,可能会遇到错误提示:“Cannot open include file: 'jni.h': No such file or directory”。...设置编译器选项为了让编译器知道​​jni.h​​的位置,你需要在编译命令中指定包含路径。这可以通过添加​​-I​​选项来实现。...在开发使用 Java Native Interface (JNI) 的应用程序时,经常会遇到编译 C/C++ 代码时提示“Cannot open include file: 'jni.h': No such...设置编译器包含路径:在编译 C/C++ 代码时,需要告诉编译器去哪里找到 ​​jni.h​​ 文件。...使用命令行编译器(如gcc)如果你使用的是命令行编译器(如gcc),可以在编译命令中添加包含路径。

    39110

    【C++】泛型编程 ⑤ ( 函数模板原理 | C++ 编译器原理 | C C++ 编译器编译过程 | 分析 模板函数代码 汇编文件 | 编译 模板函数代码 汇编文件 | 模板函数汇编分析总结 )

    分析 C++ 编译器的 函数模板 实现底层机制 ; 一、C++ 编译器原理 1、gcc 编译器简介 gcc 编译器 英文名称是 " GNU C Compiler " , 支持编译多种语言 , 可以解析不同的语言...+文件处理 ; 编译阶段区别 : 在编译阶段 , g++ 编译器 会自动链接 STL 库 , 而 gcc 必须要加一个参数 -lstdc++ ; 预定义宏区别 : gcc 在编译 c 文件时 , 可用的预定义宏比较少...语法区别 : 虽然 C++ 语言 是 C 语言 的超集 , 但是两者对语法的要求是有区别的,C++的语法规则更加严谨一些 ; 5、gcc / g++ 编译器常用命令选项 gcc / g++ 编译器常用命令选项...在C++中,编译器会为每个模板函数生成一个特定的符号名称,这是模板函数的实例化。...这些属性可能是由链接器或其他工具使用的,以确定如何处理该符号。

    1K20
    领券