在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选项导致双击启动失败的问题的更多相关文章

  1. [转载]Ubuntu环境下检查CPU 的温度

    原文地址:https://www.linuxprobe.com/ubuntu-cpu-temperature.html 我们将使用一个GUI工具Psensor,它允许你在Linux中监控硬件温度.用P ...

  2. Ubuntu环境下SSH的安装及使用

    Ubuntu环境下SSH的安装及使用 SSH是指Secure Shell,是一种安全的传输协议,Ubuntu客户端可以通过SSH访问远程服务器 .SSH的简介和工作机制可参看上篇文章SSH简介及工作机 ...

  3. Linux(Ubuntu)环境下使用Fiddler

    自己的开发环境是Ubuntu, 对于很多优秀的软件但是又没有Linux版本这件事,还是有点遗憾的.比如最近遇到一个问题,在分析某个网站的请求路径和cookie时就遇到了问题.本来Chome浏览器自带的 ...

  4. ubuntu环境下docker安装步骤

    本文是根据docker官方文档翻译,原文:https://docs.docker.com/engine/installation/linux/ubuntulinux/ Docker 支持以下 Ubun ...

  5. Ubuntu环境下配置Android Studio【转】

    本文转载自:https://www.jianshu.com/p/1f6295f9c955 之前学习Android开发的时候,一直跟各种教程一样,使用的是Eclipse+ADT,主要是比较方便,容易上手 ...

  6. 在Ubuntu环境下配置Proxmark3(PM3)使用环境

    参考资料:PM3官方Wiki 因为国内网络上大多是在Kali系统上使用PM3的教程(链接1.链接2.链接3),而这些教程的步骤对于Ubuntu系统并不完全适用.所以写下本文,记录我个人的安装经历. 本 ...

  7. Go学习笔记(一):Ubuntu 环境下Go的安装

    本文是根据<Go Web 编程>,逐步学习 Ubuntu 环境下go的安装的笔记. <Go Web 编程>的URL地址如下: https://github.com/astaxi ...

  8. Ubuntu环境下的Redis 配置与C++使用入门

      Redis是一个高性能的key-value数据库. Redisedis的出现,非常大程度补偿了memcached这类key/value存储的不足,在部分场合能够对关系数据库起到非常好的补充作用.它 ...

  9. ubuntu 环境下的QT程序打包

    很多的时候 需要将自己写的QT 程序发布一下  所以今天教一下 怎么在ubuntu 环境下将自己的写的Qt 程序打包打包是为了不依赖 开发环境 和开发的库. 1. QtCreate使用Release版 ...

  10. ubuntu环境下eclipse的安装以及hadoop插件的配置

    ubuntu环境下eclipse的安装以及hadoop插件的配置 一.eclipse的安装 在ubuntu桌面模式下,点击任务栏中的ubuntu软件中心,在搜索栏搜索eclipse 注意:安装过程需要 ...

随机推荐

  1. iOS日志操作与开发,你真的会重视吗

    iOS中常用日志和上报系统浅析 类CocoaLumberjack日志框架架构浅析 Crash的类型介绍和常用收集方案 常用上报技术方案对比和分析

  2. fatal: bad object refs/remotes/origin/xxx

    解决方案: 1.项目的.git文件内的目录.git/logs/refs/remotes/origin/,删除该错误的本地远程分支: 2.执行git pull --rebase即可 类似错误信息例子: ...

  3. 【Azure 应用服务】Storage Queue触发Azure Function时报错 The input is not a valid Base-64 string

    问题描述 创建一个PowerShell脚本的Azure Function,触发方式为 Storage Queue.但执行函数结果一直失败 (Failed). 错误消息为: Executed 'Func ...

  4. 【Azure Developer】CURL 发送Oauth2 Token请求获取到 404 Not Found 问题

    问题描述 当使用 Postman 向AAD 发送如下请求时候,得到了404 Not Found的错误. "curl --location --request POST 'https://lo ...

  5. PaddleOCR 服务化部署(基于PaddleHub Serving)

    最近用到百度飞桨的 PaddleOCR,研究了一下PaddleOCR的服务化部署,简单记录一些部署过程和碰到的问题. 基础环境 paddlepaddle 2.5.2 python 3.7 paddle ...

  6. CodeIgniter3.chm 打包编译 需要 hhc.exe - php框架

    电子书地址 https://github.com/CodeIgniter-Chinese/rapid-php-application-development 我打包编译好了chm,https://fi ...

  7. vscode vue 组件定位插件 webpack-code-inspector-plugin -- 强烈推荐 Alt+Shift+鼠标左键

    作用 alt + shift + 鼠标左键 自动跳转 vscode项目的组件代码 项目地址 https://github.com/zh-lx/code-inspector/blob/main/pack ...

  8. .vscode\settings.json .gitignore 项目文件配置

    一.项目本地新增配置文件: .vscode\settings.json {   // editor   "editor.formatOnSave": true,   "e ...

  9. 基于可穿戴的GPS定位存储模块方案特色解析

    前记   GPS作为一个位置定位手段,在日常生活中扮演着非常重要的角色.在研发动物可穿戴产品的同时.团队一直在做产品和模块标准化的事情,尽量把研发出来的东西标准化.按照任老板的说法,在追求理想主义的路 ...

  10. ESP8266 下安装esptool.py并使用esptool刷机神助手

    一 前记 在使用ESP8266模块时,通常会用到一些刷机软件.官方提供了nodemcu_flasher.ESPFlashDownloadTool.ESP8266Flasher等下载工具,但是缺少更底层 ...