cmake 交叉编译应用程序:手动设置链接脚本
前言
-
在使用 cmake 交叉编译应该应用程序时,好像没有手动设置【链接脚本】,也能正常构建生成 Makefile,并且可以正常 Make 生成需要的 应用程序。
-
但是有些应用程序,需要手动指定【链接脚本】,比如修改链接地址,这在 cmake 构建中如何操作呢?
-
当前没有设置链接脚本,发现编译后的应用程序的入口地址为 0
如下: Entry point address: 0x0
readelf -h routingmanagerd
ELF Header:Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class: ELF64Data: 2's complement, little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: DYN (Shared object file)Machine: AArch64Version: 0x1Entry point address: 0x0Start of program headers: 64 (bytes into file)Start of section headers: 226912 (bytes into file)Flags: 0x0Size of this header: 64 (bytes)Size of program headers: 56 (bytes)Number of program headers: 8Size of section headers: 64 (bytes)Number of section headers: 38Section header string table index: 37
了解 cmake
-
默认 cmake 的构建操作只生成 Makefile,然后需要再执行 make 命令进行编译、链接。
-
所以可以在 cmake 的构建文件中,增加【链接脚本】的选项
cmake 设置链接脚本路径
- cmake 可以通过
set
命令轻松设置 环境变量,这里的操作是,在 cmake 文件中增加
set(LINK_SCRIPTS "-T/home/zhangsz/smart/adas/software/userapps/linker_scripts/aarch64/link.so.lds")
-
说明:可以使用 set 在 cmake 中设置环境变量,环境变量名字可以自定义。如果环境变量存在,可以使用
${LINK_SCRIPTS}
获取设置过的环境变量 -
这里的操作是:设置环境变量
${LINK_SCRIPTS}
为 指定的链接脚本的路径 -
-T/home/zhangsz/userapps/linker_scripts/aarch64/link.so.lds
这里的-T
表示指定链接脚本,用于 gcc 的编译参数, 后面是 链接脚本的路径
cmake 应用程序生成
-
cmake 生成目标文件,默认使用:
target_link_libraries
,这里是动态链接,如下: -
在
target_link_libraries(routingmanagerd ${VSOMEIP_NAME} ${Boost_LIBRARIES} ${DL_LIBRARY} ${DLT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${LINK_SCRIPTS})
中增加了刚才加入链接脚本的【环境变量】,这里是${LINK_SCRIPTS}
- cmake 最终会把这些操作,环境变量,转换为 gcc 或者交叉编译 gcc 的 参数
编译验证
- 编译的详细 LOG,发现 链接脚本设置成功了
-
cmake 后,再使用 make 进行编译,发现编译的应用程序,链接地址与指定的链接脚本的地址一致,说明 指定链接脚本的操作 设置成功了
-
入口函数地址
Entry point address: 0x201000
,链接脚本指定的地址
readelf -h routingmanagerd
ELF Header:Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class: ELF64Data: 2's complement, little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: EXEC (Executable file)Machine: AArch64Version: 0x1Entry point address: 0x201000Start of program headers: 64 (bytes into file)Start of section headers: 232208 (bytes into file)Flags: 0x0Size of this header: 64 (bytes)Size of program headers: 56 (bytes)Number of program headers: 5Size of section headers: 64 (bytes)Number of section headers: 32Section header string table index: 31
如何查看详细的编译过程
-
cmake 配置文件中设置:
set(CMAKE_VERBOSE_MAKEFILE ON)
-
make V=1
或者VERBOSE=on
可以让编译的细节更多 -
make 编译时可以把串口的打印重定向到一个文件,这样查看这个编译信息文件,可能更方便
make VERBOSE=on 2>&1 | tee output_log.txt
小结
-
由于平时使用 cmake 不多,大部分情况下可以手动编写 Makefile,然后使用 make 编译,不过 cmake 的使用,应该会然 构建编译更简单
-
初步了解了 在 cmake 中设置与读取【环境变量】的操作,用于在 gcc 编译参数中增加 设置链接脚本
相关文章:

cmake 交叉编译应用程序:手动设置链接脚本
前言 在使用 cmake 交叉编译应该应用程序时,好像没有手动设置【链接脚本】,也能正常构建生成 Makefile,并且可以正常 Make 生成需要的 应用程序。 但是有些应用程序,需要手动指定【链接脚本】,比如修改链接地址&#…...

深入探讨Eureka的三级缓存架构与缓存运行原理
推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 史上最全文档AI绘画stablediffusion资料分享 AI绘画关于SD,GPT,SDXL等个人总结文档 资源分享 「java、python面试题…...

leetcode496. 下一个更大元素 I 【单调栈】
【简单题】(暴力遍历法很简单)但是时间复杂度很高,n的立方级别了。。。 代码: class Solution { public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int&g…...

Fastadmin框架 聚合数字生活抵扣卡系统v2.8.6
【2.8.6更新公告】 1.【优化】优化已知问题。 2.【新增 】新增区县影院。...

windows下MSYS、MinGW编译环境使用网络API时报错:undefined reference to `inet_pton‘解决办法
windows下MSYS、MinGW编译环境使用网络API时报错:undefined reference to inet_pton’解决办法 mingw-gcc环境使用网络需要加上库 -lws2_32。 如果是使用的是Qt Creator那么需要在.pro文件中加入一行:win32:LIBS -lws2_32。 当在项目中使用inet_pton、…...

unity-AI自动导航
unity-AI自动导航 给人物导航 一.地形创建 1.首先我们在Hierarchy面板中创建一个地形对象terrian,自行设定地形外貌,此时我们设置一个如下的地形外观。 二.创建导航系统 1.在主人公的Inspector、面板中添加Nav Mesh Agent (导航网格代理&…...

使用create-react-app创建react项目
create-react-app 全局安装create-react-app npm install -g create-react-app 使用create-react-app创建一个项目 $ create-react-app your-app 注意命名方式Creating a new React app in /dir/your-app.Installing packages. This might take a couple of minutes. 安装过…...

12.串,串的存储结构与模式匹配算法
目录 一. 一些术语 二. 串的类型定义 (1)串的顺序存储结构 (2)串的链式存储结构 三. 串的模式匹配算法 (1)BF算法 (2)KMP算法 四. 案例实现 串(String)---零个或多个任意字符…...

Ribbon:listOfServers ,${variableName:defaultValue}
解释: 配置了address的地址,请求会走address,也就是http://127.0.0.1:8081,通常用户与别的后端服务进行联调设置为其本地服务的ip。 如果address的地址被注释掉,如下面所示,类似这样的占位符${variableName:defaultVa…...

TensorFlow二元-多类-多标签分类示例
探索不同类型的分类模型,使用 TensorFlow 构建二元、多类和多标签分类器。 二元分类 简述 逻辑回归 二元交叉熵 二元分类架构 案例:逻辑回归预测获胜团队 多类分类 简述 Softmax 函数 分类交叉熵 多类分类架构 案例:预测航天飞机…...

【回眸】牛客网刷刷刷!(七)——通信协议之 网络通讯
目录 前言 1、TCP/IP分层模型 2、ARP缓存 3、TCP 协议之所以提供可靠传输,不怕丢包、乱序的主要的原因是 4、以太网数据链路层MII/GMII/RMII/RGMII四种常用接口 5、在以太网通信协议LWIP中,数据包管理机构采用数据结构pbuf 分类包括 6、关于以太网…...

MySQL 安装配置
MySQL 安装配置 MySQL 是最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。 MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。 MySQL由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL…...

【0824作业】C++ 拷贝赋值函数、匿名对象、友元、常成员函数和常对象、运算符重载
一、思维导图 二、作业:实现关系运算符的重载 关系运算符重载 概念: 种类:>、>、< 、< 、 、!表达式:L#R (L表示左操作数,R表示有操作数,#表示运算符)左操作数:既可以是左值也可以…...

ubuntu 22.04 LTS openai triton 安装
第一种方法: pip install triton 第二种方法,安装最新的版本: pip install -U --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/Triton-Nightly/pypi/simple/ triton-nightly 第三种方法: git c…...

Android SDK 上手指南||第七章 Java应用程序编程
第七章 Java应用程序编程 如果大家已经对Java非常熟悉,那么不妨直接忽略这部分内容。如果大家的技巧还存在局限或者对Java这种语言只闻其名,那么本文将为各位解答很多在Android开发当中经常遇到的问题。需要注意的是,这篇文章并不能作为Java…...

Vue 框架如何获取数组中的值?
在Vue框架中,获取数组中的值可以通过以下几种方式实现: 1、使用数组索引: 可以使用数组的索引来获取特定位置的值。在Vue中,可以通过在模板中使用差值表达式或指令来获取数组中的值。例如: <div>{{ myArray[0]…...

如何成立一家音频芯片/算法设计公司
一 如何成立一家音频芯片设计公司? 要成立一家音频芯片设计公司,可以按照以下步骤进行: 市场调研:了解音频芯片市场的需求和竞争情况,确定目标客户和定位。 制定商业计划:根据市场调研的结果࿰…...

用docker-compose搭建LNMP
docker-compose搭建LNMP 一、compose 的部署1.Docker Compose 环境安装 二、编写Docker Compose1.准备依赖文件,配置nginx2.配置mysql3.配置php4.编写docker-compose.yml5.执行6.查看 一、compose 的部署 (1)公司在实际的生产环境中,需要使用…...

JavaScript:基本语法(变量与函数的定义与使用)
文章目录 script 标签srcdefer 延迟加载 基本语法定义变量 与 使用变量基本类型typeof 查看变量类型复合类型数组类型定义对象类型定义 函数定义函数使用函数 script 标签 src 和scc一样可以内嵌也可以外src外引。 一般是推荐外引。 <script src"idx.js">&l…...

树莓派4B上安装Gitlab
参考连接: 树莓派上使用 GitLab 搭建专业 Git 服务 | 树莓派实验室 gitlab reconfigure 卡住 ruby_block[wait for redis service socket] action run_芹菜学长的博客-CSDN博客 以及用到了讯飞星火 系统版本信息 1.进入 giblab安装页面gitlab/gitlab-ce - Instal…...

JVM 之字节码(.class)文件
本文中的内容参考B站尚硅谷宋红康JVM全套教程 你将获得: 1、掌握字节码文件的结构 2、掌握Java源代码如何在JVM中执行 3、掌握一些虚拟机指令 4、回答一些面试题 课程介绍 通过几个面试题初始字节码文件为什么学习class字节码文件什么是class字节码文件分析c…...

neo4j函数
1、断言函数 1all()判断是否一个断言适用于列表中的所有元素2all()判断是否一个断言至少适用于列表中的一个元素3none()如果断言不适用于列表中的任何元素,则返回true4single()如果断言刚好只适用于列表中的某一个元素,则返回true5exists()如果数据局库…...

wazuh初探系列一 : wazuh环境配置
目录 方法一:一体化部署 安装先决条件 第一步、安装所有必需的软件包 第二步、安装Elasticsearch 1、添加 Elastic Stack 存储库 安装 GPG 密钥: 添加存储库: 更新源: 2、Elasticsearch安装和配置 安装 Elasticsearch 包…...

【2023】Spring Validation中@NotNull注解、@NotBlank注解介绍以及使用
【2023】Spring Validation中NotNull注解、NotBlank注解介绍以及使用 前言一、简介spring-validation框架的常用注解 二、代码实现添加依赖1、实体举例2、Controller层:3、统一异常处理4、结果返回验证通过返回验证失败返回 前言 平常我们在编写代码的时候总需要很多if判空&am…...

nodejs+vue养老院管理系统 u1yrv
本智慧养老中心管理系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率,可以快速存储大量数据,还有信息检索功能,这大大的满足了老人信息和管理员这两者的需求。操作简单易懂,合理分析各个模块的功能,尽可…...

高效PDF校对:释放高质量内容的力量
在数字化世界中,内容是王者。随着企业和个人越来越依赖数字文档进行沟通、分享和创新,我们在PDF中传递的内容的质量变得至关重要。在这里,我们将探索高效的PDF校对如何帮助您释放高质量内容的真正潜力。 超越仅仅是“正确” 当我们谈论PDF校…...

【Git游戏】提交的技巧
修改历史的提交 rebase 通过git rebase -i 将要修改的提交提到最前端, 然后修改,再通过git commit --amend提交该记录,最后通过git rebase -i 在替换会原始的位置 (该过程中有可能会产生rebase confict) cherry-pick …...

SQL注入读写文件
文章目录 条件利用SQL注入漏洞读取hosts文件查看文件读写权限安全选项允许导入导出读取hosts文件 利用SQL注入漏洞写入一句话木马,并用蚁剑连接webshell写入文件 条件 SQL注入有直接SQL注入,也有文件读写时的注入,后者的主要 目的在于获取web…...

stm32之12.如何使用printf打印输出
主函数增加这些代码即可实现printf打印输出 需要添加头文件 #include "stdio.h" --------------- 源码 struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int c, FILE *f) { /* 发送一个字节 */ …...

敏感挂载hotplug容器逃逸分析与复现
前言 分析 实验 echo /path/to/hotplug/script > /proc/sys/kernel/hotplug 直接挂载设备即可,虚拟机直接启动或者卸载一下声卡就行 参考 Linux uevent分析、用户接收uevent以及mdev分析 - ArnoldLu - 博客园 (cnblogs.com)...