【问题标题】:How to distinguish between gui and console apps elf file如何区分 gui 和控制台应用程序 elf 文件
【发布时间】:2017-09-26 14:19:58
【问题描述】:

我想只执行 gui 应用程序,但问题是,我不知道如何检查。

你有解决这个问题的办法吗?

#include <stdio.h>
#include <stdlib.h>
#include <elf.h>

int main(int argc, char *argv[]) {
   if(argc < 2)return 1;
   char buf[256];
   Elf64_Ehdr elfhdr;
   FILE *f = fopen(argv[1],"rb");
   if(f == NULL)return 2;
   fread(&elfhdr,1,64, f);
   fclose(f);
   if(elfhdr.e_ident[0] == 127 && elfhdr.e_ident[1] == 'E'
      && elfhdr.e_ident[2] == 'L' && elfhdr.e_ident[3] == 'F'){
      if(elfhdr.e_type == 2){
          sprintf(buf,"./'%s' > /dev/null 2>&1 &",argv[1]);
          system(buf);
      }
   }
   return 0;
}

【问题讨论】:

  • 你的意思是给定一个ELF文件你想知道运行它是否会创建X11或类似的图形窗口,或者它是否会留在终端内?
  • @John Zwinck,是的,只有来自 X11、SDL 等的 gui
  • 您可以与ldd executable | grep "libX" 联系以查看文件是否链接到X 共享对象库。
  • 我不理解那些仅仅因为提问者误解了平台的运作方式而对问题投反对票的人。仅仅因为最佳答案可能是“无法完成”并不意味着这不是一个合理的问题。
  • @nimday 您的问题听起来像是 XY 问题。你能解释一下你的实际目的是什么吗?也就是说,是什么导致你想要做出这种区分?示例:mpv 如果给定文件是视频,则使用 GUI,否则使用 CLI。 qtchooser 是一个纯 cli 程序,其目的是透明地用另一个可能显示或不显示 GUI 的动态确定的程序替换自己。 python 程序具有打开窗口的能力,但只有在它解释的脚本命令它时才会这样做。这些示例对您来说是 GUI 还是 CLI?为什么需要区分?

标签: c linux elf


【解决方案1】:

Linux 没有区分“GUI”和控制台应用程序。这是只有 Windows 才有的东西。 Linux GUI 应用程序是碰巧调用导致窗口出现的函数的应用程序。

您可以做的是检查应用程序是否在 GUI 库中链接。问题是,要确定它们是什么并不容易。 libX 是一个,但它可能没有直接链接(可能通过另一个库)。

ldd 是一个可以运行的工具,它会告诉你可执行链接在哪些库中(包括间接链接)。如果libX11 不在列表中,则几乎确定这不是一个 GUI 程序。如果是,它可能是一个 GUI 程序。

【讨论】:

  • 你有这方面的小例子吗?
  • 只要ldd filename | grep libX11。
  • 好的,我换个linux试试
  • 也可以使用 X11 协议,根本不连接 X11。例如,ssh 可用于从远程主机运行 GUI 程序 - 但它不链接任何 X 库。
  • @jww 只是答案可能没那么有用。许多非常常见的程序使用包装脚本。有些甚至使用包装二进制文件(例如 qtchooser)。因此,即使检查目标是二进制文件也行不通。更不用说某些程序可以使用 GUI 或 CLI,具体取决于它们的调用方式。哎呀,有些人甚至根据环境设置在这些之间进行选择。
【解决方案2】:

这种区别在 Unix 中是没有用的,因为许多程序确实同时具有控制台和 GUI 行为。 ldd 也一样没用。例如在我的电脑上:

% ldd /usr/bin/firefox 
    not a dynamic executable

因为它是一个运行实际 firefox 可执行文件的 shell 脚本。然而,firefox 几乎可以肯定大部分时间都是作为 GUI 应用程序运行的。 python3 不直接链接 X 库,但任何用 Python 编写的程序都可以创建窗口,而无需执行任何其他应用程序。 ssh可用于在远程主机上执行程序,使窗口显示在本地计算机的X服务器等。

如果您需要知道哪个是 GUI 程序,请询问用户。

【讨论】:

  • ……每次都问。 mpv foo.mp3 不会创建 GUI,但 mpv bar.avi 会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多