首页
学习
活动
专区
工具
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会跳转到库函数的代码所在的内存地址,并开始执行库函数的代码 在动态库加载之后,动态库的代码和数据会被映射到进程的共享区中,使得进程可以直接访问和调用动态库中的函数和资源...这些区域的划分通常是在编译器生成可执行文件时完成的,根据程序的结构和需要,编译器会将程序划分为不同的区域,并为每个区域分配相应的权限和访问属性。

21610

从程序员角度看ELF

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

1K40
  • Linux软硬链接与动静态库

    一个可执行程序可能用到许多的库, 这些库的运行有的是静态库, 有的是动态库, 而我们的编译默认为动态链接库, 只有在该库下找不到动态.so 的时候才会采用同名静态库, 我们也可以使用gcc 的 -static...使用如下代码: $ gcc main.c -I头⽂件路径 -L库⽂件路径 -lmymath // -I指明头文件路径 总结: 测试目标文件生成后, 静态库删掉, 程序照样可以运行 库文件名称和引入库文件名称...: 去掉前缀lib, 去掉后缀 .so , .a : 如: libc.so -> c 3.2 动态库 动态库(.so) : 程序在运行的时候才去链接动态库的代码, 多个程序共享使用库的代码 一个与动态库链接的可执行文件仅仅包含他用到的函数入口地址的一个表..., 而不是外部函数所在目标文件的整个机器码 在可执行文件开始运行以前, 外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中, 这个过程称为动态链接(dynamic linking) 动态库可以在多个程序间共享..., 系统会在配置文件中的路径寻找库, 自己创建一个配置文件, 如下 然后 命令行输入ldconfig, 此时即可 程序运行时和gcc没关系了, gcc是告诉编译器, 接下来OS要加载你的程序 如何给系统指定路径

    9110

    深入浅出动静态库

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

    14010

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

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

    23310

    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.4K40

    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.8K20

    ELF文件从形成到加载轮廓

    可以在运行时由多个程序共享加载,节省内存空间,但需要确保运行环境中有正确的库文件支持。 内核转储(Core Dumps) 用于存储当前进程的执行上下文,通常在进程因信号(如段错误)触发时生成。...动态链接的程序在加载时,动态链接器(如 /lib64/ld-linux-x86-64.so.2)解析 .dynamic 和 .got.plt,加载共享库并绑定符号,确保程序运行时能访问外部函数。...未定义符号(Undefined Symbols): 如果源码引用了外部函数或变量(如标准库的 printf),但未在当前文件定义,.symtab 会标记这些符号为 UND(未定义),等待链接器从其他目标文件或库...FILE:源文件名称。 Binding:符号的绑定属性,常见绑定包括: LOCAL:本地符号,仅在当前文件可见。 GLOBAL:全局符号,可被其他文件引用。...动态链接与符号表: 可执行文件可能还有 .dynsym(动态符号表),用于动态链接,记录与共享库相关的符号(如 libc 中的函数)。

    2710

    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.5K30

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

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

    1.2K60

    动静态库:选择与应用的全方位指南

    -shared:告诉编译器gcc生成一个共享库(.so或.dll文件)。...--- 有了 其实,我们的程序在没有加载进入内存的时候,根据类别(比如权限,访问属性等),把可执行程序划分成了几个区域 。...一.先加载形成PCB和mm_struct,再对他们进行初始化 我们先明白一个点:在程序加载进入内存的时候是先加载进入代码还是先形成PCB ---PCB 就不说堆栈和共享区都是动态开辟的,在加载进入内存的时候开辟的...---- 利用:可执行程序的一块特殊的文件区域,来进行对mm_struct进行初始化 二.再将整个可执行程序加载进入内存当中,在构建页表 代码也是数据,我们将代码加载进入内存的时候,那此时,这条代码既有了在代码编译时形成逻辑地址...那么此时也就有了虚拟地址和物理地址的相互对应,这样就可以构建页表了 问:那么CPU如何找到程序的入口地址,然后运行程序的过程 用可执行程序初始化mm_struct的时候,就会顺便把头文件里的main函数的虚拟地址加载进入

    8210

    程序员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.4K20

    gcc命令大全

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

    1.7K20

    雪城大学信息安全讲义 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!"。

    41140

    地址无关码

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

    1K20

    深入浅出GCC编译器

    一、GCC交叉编译工具链 GCC编译工具链包含了GCC编译器在内的一整套工具,主要包含了GCC编译器、Binutils工具集、glibc标准函数库。...输入 size 文件名 就可以看到文件的内存占用情况 text是代码段,用于存放代码;data是用来放已初始化的数据;bss是用来放未初始化的数据。...;给定地址和可执行文件名称,它使用其中的调试信息判断与此地址有关联的源文件和行号,通常搭配 nm 使用。...glibc和libc都是Linux下的C函数库。libc是Linux下的ANSI C函数库,glibc是Linux下的GUN C函数库。...我们应该知道,在包含头文件的时候,标准库文件一般用尖括号 ,编译器回到默认的目录下寻找这些.h文件,如果是自己写的头文件,要用双引号 “” 去包含,编译器会在当前目录(源文件所在目录)进行查找。

    53210

    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格式的共享库上,调试异常。

    71710

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

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

    1.4K50

    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:查看已打断点信息

    16410
    领券