ubuntu环境下因pie选项导致双击启动失败的问题
在ubuntu环境下,链接可执行文件时增加-pie选项,双击可执行程序,无法正常启动。
对于这个现象,stackoverflow有个帖子,gcc creates mime type application/x-sharedlib instead of application/x-application,介绍的比较清晰,如下是相关的摘抄。
gcc doesn't set the mime type. mimetype guesses the appropriate mime type based on the contents of the file. For ELF files (most compiled binaries and shared libraries), the header contains a field e_type which identifies its type. If it is ET_DYN, then mimetype will treat it as a shared library.
By default, gcc/ld will produce binaries which set e_type to ET_EXEC, which get detected as application/x-executable. When the command-line option -pie is used, a position-independent executable is created, which may, like shared libraries, be loaded at different addresses and still work. Because this works so much like a shared library, to avoid too many changes to the loader, such binaries get marked as ET_DYN, even though they can be executed directly.
Some Linux distributions, yours included, have set -pie as the default. It's still possible to override this with -no-pie, but the fact that the mime type is misdetected should not be seen as a bug, and unless you know what you're doing, you shouldn't override it. -pie allows for some extra security protections that are fundamentally incompatible with -no-pie.
处理方法有如下:
方法一
链接可执行程序时,去掉-pie选项,增加-no-pie选项。
本方法降低了程序的安全性,不推荐使用。
方法二
参考恢复文件管理器中鼠标双击运行ELF可执行文件的功能,修改mime的配置,执行如下步骤:
- 修改文件
/usr/share/mime/packages/freedesktop.org.xml - 更新mime数据库,执行命令
sudo update-mime-database /usr/share/mime。
假如用户具备丰富的Linux和ubuntu使用经验,可以使用本方法。
但考虑到ubuntu版本比较多,本方法的兼容性可能没有那么好,毕竟不同版本ubuntu的配置文件,具体内容可能存在出入,指导用户修改配置的文档没有那么好写。
方法三
修改用户的操作习惯,指导用户通过快捷方式来启动程序。
创建快捷方式的方法,可参照官方指导UnityLaunchersAndDesktopFiles。
操作步骤如下:
- 创建
app.desktop文件,样例内容如下[Desktop Entry]
Version=1.0 # version of application
Name=application name
Comment=Comment for the application
Exec=/path/to/application/startup.sh
Icon=/path/to/application/icon.png
Terminal=false
Type=Application
Categories=Utility;Application;
- 为
app.desktop增加可执行权限,执行如下命令:chmod +x app.desktop
- 将
app.desktop放置到应用目录下,执行如下命令:cp app.desktop /usr/share/applications/
cp app.desktop ~/.local/share/applications/
- 将
app.desktop放到用户桌面。cp app.desktop ~/Desktop
本方法对于用户而言基本没有什么难度,新增的开发工作量其实并不大。
另行,使用脚本来启动程序,一些简单的操作比如环境检测、环境初始化类的操作,可以迁移到脚本中实现,简单、好用。
另外对于清除RPATH后导致应用程序无法直接启动的问题,可以通过本方法规避,即在脚本中修改LD_LIBRARY_PATH,将程序依赖库的路径写入到LD_LIBRARY_PATH中。
ubuntu环境下因pie选项导致双击启动失败的问题的更多相关文章
- [转载]Ubuntu环境下检查CPU 的温度
原文地址:https://www.linuxprobe.com/ubuntu-cpu-temperature.html 我们将使用一个GUI工具Psensor,它允许你在Linux中监控硬件温度.用P ...
- Ubuntu环境下SSH的安装及使用
Ubuntu环境下SSH的安装及使用 SSH是指Secure Shell,是一种安全的传输协议,Ubuntu客户端可以通过SSH访问远程服务器 .SSH的简介和工作机制可参看上篇文章SSH简介及工作机 ...
- Linux(Ubuntu)环境下使用Fiddler
自己的开发环境是Ubuntu, 对于很多优秀的软件但是又没有Linux版本这件事,还是有点遗憾的.比如最近遇到一个问题,在分析某个网站的请求路径和cookie时就遇到了问题.本来Chome浏览器自带的 ...
- ubuntu环境下docker安装步骤
本文是根据docker官方文档翻译,原文:https://docs.docker.com/engine/installation/linux/ubuntulinux/ Docker 支持以下 Ubun ...
- Ubuntu环境下配置Android Studio【转】
本文转载自:https://www.jianshu.com/p/1f6295f9c955 之前学习Android开发的时候,一直跟各种教程一样,使用的是Eclipse+ADT,主要是比较方便,容易上手 ...
- 在Ubuntu环境下配置Proxmark3(PM3)使用环境
参考资料:PM3官方Wiki 因为国内网络上大多是在Kali系统上使用PM3的教程(链接1.链接2.链接3),而这些教程的步骤对于Ubuntu系统并不完全适用.所以写下本文,记录我个人的安装经历. 本 ...
- Go学习笔记(一):Ubuntu 环境下Go的安装
本文是根据<Go Web 编程>,逐步学习 Ubuntu 环境下go的安装的笔记. <Go Web 编程>的URL地址如下: https://github.com/astaxi ...
- Ubuntu环境下的Redis 配置与C++使用入门
Redis是一个高性能的key-value数据库. Redisedis的出现,非常大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到非常好的补充作用.它 ...
- ubuntu 环境下的QT程序打包
很多的时候 需要将自己写的QT 程序发布一下 所以今天教一下 怎么在ubuntu 环境下将自己的写的Qt 程序打包打包是为了不依赖 开发环境 和开发的库. 1. QtCreate使用Release版 ...
- ubuntu环境下eclipse的安装以及hadoop插件的配置
ubuntu环境下eclipse的安装以及hadoop插件的配置 一.eclipse的安装 在ubuntu桌面模式下,点击任务栏中的ubuntu软件中心,在搜索栏搜索eclipse 注意:安装过程需要 ...
随机推荐
- JVM类的加载和加载器
JVM类的加载和类的加载器 一.类的加载过程 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来 ...
- 如何在矩池云上安装语音识别模型 Whisper
如何在矩池云上安装语音识别模型 Whisper Whisper 是 OpenAI 近期开源的一个语音识别的模型,研究人员基于 680,000 小时的标记音频数据进行训练,它同时也是一个多任务模型,可以 ...
- 苹果工程师对iOS线程开发的那点事津津乐道
pthread,Thread总结 pthread: 通用的多线程API 使用方法 // 1. 创建线程: 定义一个pthread_t类型变量 pthread_t thread; // 2. 开启线程: ...
- 【Azure Kubernetes】通过 kubelogin 进行非交互式登录AKS
问题描述 当对AKS的登录方式(认证和授权)从"Local Account with Kubernetes RBAC "改变为"Azure AD authenticati ...
- 【Azure 事件中心】Azure Event Hub中的数据能不能存储大于7天呢?如果7天之后是不是会自动删除呢?
问题描述 Event Hub中有个retention的设置为7天,有没有办法增大这个Retention的时间? 如果没办法,是不是超过7天的数据就会被删除? 问题解答 因为Azure Event Hu ...
- 【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
问题描述 在Azure活动目录中的应用注册,给应用添加API权限时,SecurityEvents.Read.All和IdentityRiskEvent两个权限,在Microsoft graph中找不到 ...
- STL-queue模拟实现
#include<list> #include<assert.h> #include<deque> #include<iostream> using s ...
- Netty笔记(7) - 使用Netty 模仿 Dubbo 实现简单的 远程调用
使用Netty 模仿 Dubbo 实现简单的 远程调用 使用 java的反射 动态代理 加 Netty的远程访问 实现根据接口的RPC 远程调用 定义两个公共接口: public interface ...
- jenkins 钉钉机器人插件
官方文档: https://jenkinsci.github.io/dingtalk-plugin/guide/getting-started.html#%E6%B3%A8%E6%84%8F 注意:系 ...
- 通过debug搞清楚.vue文件怎么变成.js文件
前言 我们每天写的vue代码都是写在vue文件中,但是浏览器却只认识html.css.js等文件类型.所以这个时候就需要一个工具将vue文件转换为浏览器能够认识的js文件,想必你第一时间就想到了web ...