首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

gcc共享库初始化器函数对当前可执行文件名称的访问

是指在使用gcc编译生成共享库时,可以通过初始化器函数来获取当前可执行文件的名称。初始化器函数是在共享库加载到内存时自动执行的函数,用于进行一些初始化操作。

通过初始化器函数可以获取当前可执行文件的名称,可以使用以下代码来实现:

代码语言:txt
复制
#include <stdio.h>

void __attribute__((constructor)) init_func() {
    extern char *__progname;
    printf("当前可执行文件名称:%s\n", __progname);
}

在上述代码中,__attribute__((constructor))是gcc的扩展语法,用于指定一个函数为初始化器函数。__progname是一个外部变量,用于保存当前可执行文件的名称。

初始化器函数可以用于在共享库加载时执行一些特定的操作,例如初始化全局变量、注册回调函数等。对于当前可执行文件名称的访问,可以用于根据可执行文件的名称来进行不同的初始化操作,或者在日志输出中记录当前可执行文件的名称。

在腾讯云的云计算平台中,可以使用云函数(SCF)来部署和运行自定义的初始化器函数。云函数是一种无服务器计算服务,可以在云端运行代码,支持多种编程语言,包括C语言。您可以使用腾讯云函数计算(SCF)来创建和管理云函数,具体可以参考腾讯云函数计算产品介绍:https://cloud.tencent.com/product/scf

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux:基础IO(三.软硬链接、动态和静态、动精态制作和加载)

硬链接与原始文件之间没有任何区别,它们共享相同inode和数据块,因此任意一个文件修改都会影响其他所有硬链接指向文件。...在GCC或其他类似的编译中,通常使用-shared选项来指示应该生成一个共享。...这是共享所需要,因为共享可以在程序运行时被加载到任何内存地址。使用-fPIC选项(在GCC中)告诉编译生成这样代码(产生与位置无关码)。...当程序执行到调用库函数代码时,CPU会跳转到库函数代码所在内存地址,并开始执行库函数代码 在动态加载之后,动态代码和数据会被映射到进程共享区中,使得进程可以直接访问和调用动态函数和资源...这些区域划分通常是在编译生成可执行文件时完成,根据程序结构和需要,编译会将程序划分为不同区域,并为每个区域分配相应权限和访问属性。

13210

从程序员角度看ELF

可执行文件,他们入口点都是 _start,   然后由 _start 函数调用 _init 执行相关 .init 节中初始化代码!...(这里针对ELF可执行文件,对于共享.init段,还是由interpreter来调用!!!...see 启动过程::共享初始化)   而dlopen 一个 .so 共享后,_init 函数在返回前会被调用,.so 共享   是没有 _start !   ...链接可以通过计算符号散列值,然后访问相应散列队列进行查找以加速   符号搜索速度。   查找   链接自身初始化完成之后,它就会去寻找程序所需要各个。...共享初始化   现在加载再次查看每个并处理重定位项,填充GOT,并进行库数据段所   需任何重定位。

95440

深入浅出动静态

其实我们在最开始学C语言时候就使用过,只不过当时在你视角察觉不到而已,我们可执行程序使用如下两个命令即可查看链接情况: ldd proc_exe#用于打印程序或文件所依赖共享列表 file...所以,可执行文件只包含了程序代码和引用,所以动态也叫做 共享。 在静态链接中:编译将程序所需所有代码和数据都复制到可执行文件中。...所以就可以 通过可执行程序数据来初始化地址空间和页表 了!   这里值得注意是:不仅仅是操作系统要遵守虚拟地址空间,编译同样也要遵守!...cr3寄存:保存着当前任务页表起始地址。   ...有了这两个寄存,我们就好办多了,要想执行程序,那就必须要有程序main函数起始地址,而恰好在可执行程序头部保存了程序起始位置地址,在初始化地址空间时,其也被pc指针读取,于是代码就可以被pc指针与其他寄存配合正常执行完毕

10610

【Linux】动态与静态底层比较

但是对应方法并没有在可执行程序中,所以动态是怎样被调用呢?又是什么时候被调用呢? 动态也会写入到内存中,并通过页表映射到地址空间中共享区。让调用时候通过共享区来找到对应方法实现。...初始值从可执行程序来!通过可执行程序自身头部属性信息(虚拟地址)来初始化地址空间。...虚拟地址空间不是操作系统独有的 ,OS ,编译,加载都会存在虚拟地址 此时就可以来把程序加载到内存中了 CPU中存在这样一个寄存pc指针,用来指向当前执行指令下一条指令地址,pc指向哪里,CPU...首先,虚拟地址储存在共享区 在磁盘中,动态编址是平坦模式编址,其地址0x1234就像是距离0000...一个偏移量 然后在共享区里,这个偏移量是没有改变1 所以想要执行库函数,就直接到共享区通过起始地址...同样其他进程也可以通过共享起始地址 + 偏移量映射,来访问内存中函数。库函数调用,其实也是在进程地址空间里来回跳转!!!与非库函数类似奥! 那么怎么知道一个有没有被加载到内存中呢?

17910

Linux系统下基础命令介绍

7​ /lib 该目录用来存放系统动态连接共享,几乎所有的应用程序都会用到该目录下共享 。 8​ /lost+found 该目录在大多数情况下都是空。...1.2.3 man命令:查看帮助 功能:用于查看命令、函数、头文件使用帮助信息。 用法: man [页码] 页码一般为1-7页。...要求创建目录用户在当前目录中 (dirname父目录中)具有写权限,并且dirname不能是当前目录中已有的目录或 文件名称。 参数: - m 新建目录设置存取权限。...使用GCC编译时候,我们必须给出一系列必要调用参数和文件名称GCC编译调用参数大约有100多个,这里只介绍其中最基本、最常用参数。...GCC最基本用法∶ gcc [参数] [文件名称] ​ 常用参数如下 -c 只编译:不链接成为可执行文件,编译只是由输入.c等源代码文件生成.o为后缀目标文件,通常用于编译不包含主程序子程序文件

1.3K40

linux 什么是SO文件

下面的内容大多都是连接中,穿插我自己笔记 牵扯到ELF格式,gcc编译选项待补,简单实用说明一下,Linux下so文件有个实际性认识。 1.so文件是什么?...2.怎么生成以及使用一个so动态文件? 3.地址空间,以及线程安全. 4.初始化,解析: 5.使用我们自己库里函数替换系统函数: 1.so文件是什么?...这正是共享所要求共享被加载时,在内存位置不是固定。 -g: 令 gcc 生成调试信息,该选项可以利用操作系统“原生格式(native format)”生成调试信息。...GDB 可以直接利用这个信息,其它调试也可以使用这个调试信息 -c: 仅执行编译操作,不进行连接操作。 -o: 指定生成输出文件名称 注意!-c,-o不是指.c文件和.o文件!!...下面的还没细看,汗 4.初始化,解析: windows下动态加载,卸载都会有初始化函数以及卸载函数来完成初始化以及资源回收,linux当然也可以实现。

5.7K20

Linux下静态、动态创建与调用

动态称为共享. 程序在编译时需要、运行时候也需。 静态在编译时候抽取需要使用函数进行编译、运行时候不需要。 静态编译程序比动态链接占用空间更加大。...二、动态创建与使用案例 2.1 创建动态 创建动态语法格式: gcc -fPIC -shared -o .so 源文件名称.c 如何命名?...sum]$ ls libsum.so sum.c sum.h 2.2 gcc编译时常用语法选项 gcc [选项参数] 常用选项参数介绍: -o 指定编译之后生成可执行文件名称...例如: gcc 123.c -L/wor/lib -L/home/lib ... -l 指定编译时使用文件名称. 可以指定文件名称..../a.out 三、静态创建与使用 3.1 创建静态 注意: 动态如果静态名字重名时候,编译优先使用动态.

5.4K30

程序生成之编译、链接、加载浅析

目标文件 生成目标文件一般为下列三种: 可重定位(Relocatable)目标文件:由编译和汇编生成,可与其他可重定位目标文件合并,创建一个可执行共享目标文件; 共享(Shared)目标文件:...一种特殊可重定位目标文件,可以在链接(静态共享)时加入目标文件,也可以在加载或运行时(动态共享)动态被加载到内存并执行; 可执行(Executable)目标文件:由链接生成,可直接通过加载加载到内存中...为了创建可执行文件,链接必须完成任务是: 符号解析:把目标文件中符号定义和引用联系起来; 重定位:把符号定义和内存地址对应起来,然后修改所有符号引用。...动态链接(ld-linux.so)链接程序在运行过程中,根据记录共享对象符号定义来动态加载共享,然后完成重定位。在该可执行文件被执行时,动态链接全部内容被映射到运行时相应进程虚地址空间。...在执行完初始化任务,即_init之后,启动代码调用atexit例程,该例程注册了一系列调用exit函数时必须例程。

1.2K60

程序员C语言快速上手——工程篇(十二)

C程序编译四个阶段 回顾一下C语言编译四个阶段 预处理 编译 汇编 链接 在GCC编译中,这四个阶段实际上是分别调用四个程序来处理,gcc其提供了包装命令。...,而GCC工具在链接时,也并未直接使用链接进行链接,而是使用collect2来处理链接,它会调用各种初始化函数,并使用libgcc来设置__main符号,从而将main函数作为入口。...因此,当我们编写好代码,并依赖动态生成可执行文件时,说是关联动态,而不是链接动态。动态链接工作是由一个叫动态链接东西完成, 不是由gcc编译时调用ld完成。...当链接ld将app1.o链接成可执行文件时, 这时链接必须确定app1.o中所引用int_div函数性质。...如果int_div函数是一个定义在其他静态目标模块中函数, 那么链接将会按照静态链接规则, 将app1.o中int_div地址重定位;如果int_div是一个定义在某个动态共享函数, 那么链接就会将这个符号引用标记为一个动态链接符号

1.3K20

gcc命令大全

一、gcc基本用法 使用gcc编译时,必须给出一系列必要调用参数和文件名称。不同参数先后顺序执行结果没有影响,只有在使用同类参数时先后顺序才需要考虑。...gcc最基本用法是:gcc [options] [filenames] 其中,options就是编译所需要参数,filenames给出相关文件名称,最常用有以下参数: -c :只编译,不链接成为可执行文件...-lname:链接时装载名为 libname.a 函数。该函数位于系统默认目录或者由 -L 选项确定目录下。例如,-lm 表示链接名为 libm.a 数学函数。...三、操作选项 在Linux下开发软件时,完全不使用第三方函数情况是比较少见,通常来讲都需要借助一个或多个函数支持才能够完成相应功能。...如果需要的话,可以在编译时加上 -static 选项,强制使用静态链接。 (5) -shared 生成一个共享目标文件,它能够与其他目标一起链接生成一个可执行文件。

1.5K20

雪城大学信息安全讲义 3.2 Set-UID 程序漏洞

2 Set-UID 程序漏洞 2.1 隐藏输入:环境变量 特权程序必须所有输入进行安全检查。输入检查实际上是访问控制一部分,特权程序必须这么做,来确保程序安全。...动态链接或加载ld.so/ld-linux.so加载程序所需共享,准备要运行程序,之后运行它。你可以使用下面的命令来观察程序需要什么共享。...% ldd /bin/ls LD_LIBRARY_PATH是一个环境变量,被动态链接或加载(ld.so/ld-linux.so)使用。它含有一个目录列表,让链接或者加载在搜索共享时寻找。...如果这些苦可以替换为恶意副本,恶意代码就可以在共享函数被调用时执行。...没有使用,反之我们共享sleep函数会调用,并且打印"I am not sleeping!"。

37740

地址无关码

静态共享目标地址导致了很多问题,除了上面提到地址冲突问题,静态共享升级也很成问题,因为升级后共享必须保持共享中全局函数和变量地址不变,如果应用程序在链接时已经绑定了这些地址,一且更改...即使升级静态共享后保持原来函数和变量地址不变,只是增加了一些全局函数或变量,也会受到限制,因为静态共享被分配到虚拟地址空间有限,不能增长太多,否则可能会超出被分配空间。...如果变量在共享模块中被初始化,那么动态链接还需要将该初始化值复制到程序主模块中变量副本;如果该全局变量在程序主模块中没有副本,那么GOT中相应地址就指向模块内部该变量副本。...但是装载时重定位共享对象运行速度要比使用地址无关代码共享对象快,因为它省去了地址无关代码中每次访问全局数据和函数时需要做一次计算当前地址以及间接地址寻址过程 对于可执行文件来说,默认情况下,如果可执行文件是动态链接...,那么GCC会使用PC方法来产生可执行文件代码段部分,以便于不同进程能够共享代码段,节省内存。

97220

Linux从入门到精通(九)——Linux编程

总的来说,如果读者 GCC 编译版本没有要求,则推荐使用此安装方式;反之,如果读者需要安装指定版本 GCC 编译,则需要使用接下来介绍安装方法。...5.1.2 手动安装 此方式需要耗费时间较长(几个小时),但支持安装指定版本 GCC 编译,并适用于大多数 Linux 发行版(不同之处会有额外提示);同时,如果读者想已安装 GCC 编译进行版本升级...-L dir指明文件所在位置,在库文件搜索路径列表中添加dir目录-l name指定文件名称,链接名为libname.a(静态)或者libname.so(动态文件。...动态文件: 编译链接时,没有把文件代码加入到可执行文件中,在执行时候去访问文件,节省系统开销,生成文件也小,后缀一般.so。.../usr/lib或者/lib中,而动态文件是在运行时访问,在执行.

2K30

Binary程序分析查看类命令

gcc | Gnu C Compiler | 作为一个软件被你调用来编译C程序时候 g++ | Gnu c++ compiler | 其实g++只是调用gcc,然后连接c++,并且作相应一些编译设置而已...4、堆栈段:包含了函数内部声明局部变量。...const int i_data=1; return 1; } WeiyiGeek.案例演示 0x01 应用依赖查看 ldd 命令 描述:用于打印程序或者文件所依赖共享列表。...ld-linux.so(elf动态装载)来实现; 它能够显示可执行模块dependency(所属)(所属),其原理是通过设置一系列环境变量,如下:LD_TRACE_LOADED_OBJECTS...如果命令行中给定名字包含/,这个程式libc5版本将使用他作为名字;否则他将在标准位置搜索; 注意ldd不能工作在a.out格式共享上,调试异常。

68410

Linux基础——Linux开发工具(中)_gccg++

如果前面yum和vim有什么不懂建议回顾去回顾上期知识!!! Linux开发工具(yum, vim) 首先让我们来初步了解一下本篇内容: 1. 学习gcc/g++,并能学会如何使用 2....) 链接(生成可执行文件或文件) 1.1 gcc/g++使用方法 gcc/g++使用方法如下: 生产可执行程序a.out 指令:gcc code.c 自定义可执行程序名字 指令:gcc....o文件进行链接,生成可执行程序 .o文件 + 系统 = 可执行程序 因此这里又涉及到一个重要概念:函数 我们直接用指令查看一下: 指令:gcc test.o -o test 若未自定义文件名称...函数 函数一般分为静态和动态两种: 静态是指编译链接时,把文件代码全部加入到可执行文件中,因此生成文件比较大,但在运行时也 就不再需要文件了。...info/i locals:查看当前栈帧当中局部变量值 断点: break/b n:在第n行设置断点 break 函数名:在某个函数开头设置断点 info break/b:查看已打断点信息

13510

【库函数】Linux下动态.so和静态.a生成和使用

可以分为静态和动态两种类型: 静态 作用:在程序编译时候,将编译进可执行程序中, 运行时候不需要外部函数 目录:默认目录 /lib 或 /usr/lib 或 /usr/local...数据访问、网络通信等) 自定义(根据项目需求编写特定功能.h头文件理解 传送门:【头文件】.h文件理解-CSDN博客 2....-fpic 选项用于生成与位置无关代码,这是动态链接所必需。 第二行命令: 使用 -shared 选项将目标文件链接成一个共享对象(动态) libtest.so。...-ltest:指定要链接文件名称。 链接完成会生成一个 main 可执行文件,这个可执行文件到底有没有成功链接到动态链接呢?...参数说明: -L 参数指定了编译搜索文件路径 -lstatic 指定了要链接静态名字(注意,lib 前缀和 .a 扩展名都不需要在此处指定) 然后运行可执行文件 test: .

1K10

Linux系统开发: 基础命令学习

/lib 该目录用来存放系统动态连接共享,几乎所有的应用程序都会用到该目录下共享 。 /lost+found 该目录在大多数情况下都是空。...2.3 man命令:查看帮助 功能:用于查看命令、函数、头文件使用帮助信息。 用法: man [页码] 页码一般为1-7页。...要求创建目录用户在当前目录中 (dirname父目录中)具有写权限,并且dirname不能是当前目录中已有的目录或 文件名称。 参数: - m 新建目录设置存取权限。...使用GCC编译时候,我们必须给出一系列必要调用参数和文件名称GCC编译调用参数大约有100多个,这里只介绍其中最基本、最常用参数。...GCC最基本用法∶ gcc [参数] [文件名称] 常用参数如下 -c 只编译:不链接成为可执行文件,编译只是由输入.c等源代码文件生成.o为后缀目标文件,通常用于编译不包含主程序子程序文件

1.3K50

Linux编译工具:gcc入门

4. gcc常用选项 来看一下gcc常用选项 选项名 作用 -o 产生目标(.i、.s、.o、可执行文件等) -E 只运行C预编译 -S 告诉编译产生汇编程序文件后停止编译,产生汇编语言文件拓展名为...汇编文件进行编译,生成了目标文件 gcc hello.o -o hello 目标文件进行链接,生成可执行文件 gcc hello.c -o hello 直接编译链接成可执行目标文件 gcc -c...使用外部 在使用C语言和其他语言进行程序设计时候,我们需要头文件来提供常数定义和系统及库函数调用声明。文件是一些预先编译好函数集合,那些函数都是按照可重用原则编写。...-lhello 【lhello 是 libhello缩写】 其中 -L.表示文件位置在当前目录下,由于libhello.a是我们自己生成,并存放在当前录下下,所以需要加上-L.选项。...共享有时候并不不在当前目录下,为了让gcc能够找得到共享,有下面几种方法: 拷贝.so文件到系统共享路径下,一般指/usr/lib 在~/.bash_profile文件中,配置LD_LIBRARY_PATH

4.7K50

C语言 | 什么是静态链接和动态链接

但是这种方式有它缺点,缺点就是无法以商业化形式来发布函数。 商业公司需要将自己有用函数共享给别人(当然是付费),但是又不能给客户源代码。...静态与动态区别就是,静态在用户链接自己可执行程序时就已经把调用函数代码段链接进最终可执行程序中了,相当于是把别人代码拷贝了一份,哪里有调用,哪里就要拷贝,这样程序是很完整,但是有个缺点...而动态不一样,动态链接本身不将库函数代码段链接入可执行程序,只是做个标记。...这个时候还是有问题,提示找不到,这是因为这个是我们自己写,编译并不知道去哪里找,所以,还应该指定路径 gcc main.c -o jintai -ltest -L....就是指定链接到当前路径,这个时候我们发现已经可以正常编译程序,并且可以生成可执行文件,执行结果也是正确。 ? 以上就是静态链接制作及使用方法。

4.3K40

静态链接和动态链接区别

面对比一下两者:静态链接:当要使用时,连接会找出程序所需函数,然后将它们拷贝到执行文件,由于这种拷贝是完整,所以一旦连接成功,静态程序也就不再需要了。...3.3、动态初始化和解析Windows下动态加载,卸载都会有初始化函数以及卸载函数来完成初始化以及资源回收,linux当然也可以实现,这些初始化函数主要包含两个部分:动态构造和析构函数机制...使用G++其进行编译:g++ -fPIC -shared b1.c -o libb.so编译成功!可见GCC和G++对于这种全局变量初始化方法,支持力度是不一样。...如果强制使用静态则需要加-static选项支持,即:gcc-static -o main main.c -L. -lmymath链接静态可执行程序明显比链接动态可执行文件大。...2、用ldd命令可以查看一个可执行程序依赖共享

8K21
领券