如何在使用gcc编译后获取执行文件的名称?

时间:2016-11-29 19:01:01

标签: c gcc fedora

我用C编写程序,我希望它能检测出自己的名字。我将解释:

我希望它根据其名称执行特定操作。让我们说:

gcc Program1.c -o Program1

此代码包含在Program1.c中,并使用以下代码编译:

./Program1

我执行它:

{{1}}

但是我无法找到能让我获得价值的代码" Program1" (可执行文件的名称),它是我给出的代码中的变量myName。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:3)

默认情况下,gcc输出的名称不存储在文件中的任何位置,我不知道将其注入二进制文件的方法。但这是你真正想要的吗?

作为调用程序的名称可用作argv[0]。如果在编译后重命名了可执行文件,则可能会有所不同。

#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("My name is %s\n", argv[0]);
    return 0;
}

调用程序选择参数0。它可以是包含目录信息的完整路径(通常取决于调用者是执行PATH查找还是从显式位置调用可执行文件),因此如果您想基于此行为,您应该删除路径信息(例如{在Unix / POSIX平台上{1}}。

参数0由调用者选择,因此这是一个常规问题。但这是一个非常普遍遵循的惯例,除非调用者有充分的理由不尊重它。大多数平台都有办法找到可执行文件。例如,在Linux上,basename是可执行文件的符号链接。但在大多数情况下,如果调用者传递了不同的名称,这意味着调用者希望您的程序表现为不同的名称,因此您应该使用/proc/self/exe

如果在没有参数的情况下调用程序(例如argv[0]为0),则

argv[0]可以为NULL。这种情况很少见,但为了稳健,你的程序在这种情况下应该做一些合理的事情。