共享库构造函数不工作

2024-01-04

在我的共享库中,我必须在加载时进行某些初始化。如果我用 GCC 属性定义函数__attribute__ ((constructor))它不起作用,即当加载链接我的共享库的程序时它不会被调用。

如果我将函数名称更改为_init(), 有用。显然使用_init() and _fini()函数是不建议 http://www.faqs.org/docs/Linux-HOWTO/Program-Library-HOWTO.html#INIT-AND-CLEANUP now.

知道为什么吗__attribute__ ((constructor))行不通?这是Linux 2.6.9,gcc版本3.4.6

Edit:

例如,假设库代码如下:

#include <stdio.h>

int smlib_count;

void __attribute__ ((constructor)) setup(void) {
    smlib_count = 100;
    printf("smlib_count starting at %d\n", smlib_count);
}

void smlib_count_incr() {
    smlib_count++;
    smlib_count++;
}

int smlib_count_get() {
    return smlib_count;
}

为了构建 .so 我执行以下操作:

gcc -fPIC -c smlib.c
ld -shared -soname libsmlib.so.1 -o libsmlib.so.1.0 -lc smlib.o
ldconfig -v -n .
ln -sf libsmlib.so.1 libsmlib.so

由于 .so 不在标准位置之一,我更新了LD_LIBRARY_PATH并从另一个程序链接 .so 。构造函数不会被调用。如果我把它改成_init(), 有用。


好的,我已经看了一下,看起来发生的事情是你的中间gcc步骤(使用-c) 导致了这个问题。这是我对所看到内容的解释。

当你编译为.o with setup(), gcc只是将其视为普通函数(因为您没有将其编译为.so,所以它不在乎)。然后,ld没有看到任何_init()或类似的东西DT_INIT在 ELF 的动态部分,并假设没有构造函数。

当你编译为.o with _init(), gcc也将其视为正常功能。事实上,在我看来就像目标文件是相同的除了函数本身的名称!所以再一次,ld看着.o文件,但这次看到一个_init()函数,它知道它正在寻找它,并确定它是一个构造函数,并相应地创建一个DT_INIT进入新的.so.

最后,如果您一步完成编译和链接,如下所示:

gcc -Wall -shared -fPIC -o libsmlib.so smlib.c

然后发生的事情是gcc看到并理解__attribute__ ((constructor))在创建共享对象的上下文中,并创建DT_INIT相应地输入。

简短版本:使用gcc一步完成编译和链接。您可以使用-Wl(请参阅手册页)用于传递额外选项,例如-soname如果需要的话,比如-Wl,-soname,libsmlib.so.1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

共享库构造函数不工作 的相关文章

  • 改变 RGB 颜色的色调

    我正在尝试编写一个函数来改变 RGB 颜色的色调 具体来说 我在 iOS 应用程序中使用它 但数学是通用的 下图显示了 R G 和 B 值如何随色调变化 看起来 编写一个函数来改变色调似乎应该是一个相对简单的事情 而不需要对不同的颜色格式进
  • SIGKILL 和 SIGSTOP 信号无法被捕获、阻止或忽略,为什么?

    我想知道为什么这两个信号在一个进程中不能被捕获 阻止或忽略 可以使用 signal 更改其余信号的操作 这两个信号和其余信号有什么区别 如果您谈论它们被阻止的原因 那么原因已经提到了 Adam B https stackoverflow c
  • for 和 while 循环中没有循环条件

    while cond fine for cond fine 但是当我删除条件部分时 while syntax compilation error for Infinite loop 这些循环内部是如何实现的 或者 编译器 解析器 如何知道中
  • 在 Eclipse 4.4.2 中使用 C 代码中的构建变量

    我有一个之前使用 Eclipse 3 5 2 创建的项目 在其中 我能够在项目属性中设置构建变量 在这种情况下 假设我设置了SW VERSION是 4403 现在这应该是一个十六进制数字 所以在构建设置中 我添加了一个符号 VERSION
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • ReportViewer“缺少 URL 参数:名称”

    在一个网络应用程序中 我正在处理 ReportViewer 时不断出现错误 缺少 URL 参数 名称 我找到了原因 但没有找到解决方案 导致报告查看器出现异常的 url Reserved ReportViewerWebControl axd
  • Collection.Contains() 使用什么来检查现有对象?

    我有一个强类型的自定义对象列表 MyObject 它有一个属性Id 以及一些其他属性 假设Id of a MyObject将其定义为唯一 我想检查我的收藏是否还没有MyObject对象有一个Id在我添加新的之前 共 1 个MyObject到
  • 无法将方法组分配给 asp.net、linq、c# 中的隐式类型局部变量

    public void selectqueryasso CustomerOrderResult cso new CustomerOrderResult var a from as1 in ds orders from as2 in ds o
  • 无效的跨线程访问问题

    我有两个 ViewModel 类 PersonViewModel 和 PersonSearchListViewModel PersonViewModel 实现的字段之一是通过 WCF 下载的个人资料图像 本地缓存在独立存储中 PersonS
  • 最好的 C++ 编译器是哪个? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 如何使用 Xamarin 应用程序开发自动注销

    我必须在 App xaml cs 上添加功能才能使其正常工作 我在 OnStart 上添加了功能 但现在它会间歇性地一次又一次地将我从应用程序中注销 根据下面的代码 我需要做什么才能让它停止这样做 或者我的代码有问题 这是我最新的代码 na
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 使用 CryptUnprotectData 解密 WEP wlan 配置文件密钥

    我正在尝试使用解密 WEP 配置文件的密钥加密解除数据保护 http msdn microsoft com en us library windows desktop aa380882 28v vs 85 29 aspx 我获取配置文件密钥
  • 如何在 C# 中读取 Visio 文档内容

    我的DLL库代码如下 using System using IVisio Microsoft Office Interop Visio namespace Emix public class Visio protected String p
  • C# 中 WinForm TextBox 中数字的按键事件

    我想限制用户在文本框中仅输入数字 我在按键事件中添加此代码 private void txtPartID KeyPress object sender KeyPressEventArgs e if e KeyChar gt 0 e KeyC
  • MSAL.Net 没有帐户或登录提示传递到 AcquireTokenSilent 调用

    我见过很多相同或类似的问题 并尝试了他们所有的答案 如果有的话 但这些都不适合我 我在用着这个例子 https github com Azure Samples ms identity javascript angular spa aspn
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • 如何在 MVC 5 中设置自定义 ClaimsPrincipal?

    我创建了一个自定义主体类 public class FacebookPrincipal ClaimsPrincipal public JObject Data get set 我想用它 当用户登录时 我尝试设置 var fbP new Fa
  • 类型 '' 未映射

    我已经尝试修复这个错误有一段时间了 每当我的应用程序尝试创建数据上下文的实例时 我都会收到此错误 下面是代码 using System using System Collections Generic using System Linq u

随机推荐

  • 去掉最后一个逗号

    当我的程序打印出整数 5 到 1 时 我需要帮助去掉最后一个逗号 int i for i 10 i gt 1 i if i 2 0 System out print i 2 它打印出来5 4 3 2 1 我想要打印出来5 4 3 2 1 一
  • System.Array 是否对值类型执行装箱?

    我最近做了一些粗略的性能测量List lt gt vs 对于一系列小型结构 System Array 似乎轻而易举地获胜了 所以我就这么做了 我才刚刚意识到 System Array 包含对象类型 所以用结构填充它肯定会导致装箱发生吗 然而
  • 如何在 Node.js 中使用 JQuery 选择器

    我正在尝试从硬盘驱动器中的 HTML 文件中提取电子邮件信息 如果我在 Firefox 中加载文件并运行 jQuerify bookmarklet 我可以成功使用以下选择器 函数 window jQuery a iEmail each fu
  • Rx:如何立即响应并限制后续请求

    我想设置一个 Rx 订阅 它可以立即响应事件 然后忽略指定 冷却 期内发生的后续事件 开箱即用的 Throttle Buffer 方法仅在超时结束后才会响应 这并不是我所需要的 这是一些设置场景并使用 Throttle 的代码 这不是我想要
  • 如何将 x,y,y0 以外的属性附加到 d3 中的流图层?

    我是 d3 新手 我一直在尝试自定义 Streamgraph 示例 http mbostock github com d3 ex stream html http mbostock github com d3 ex stream html
  • Vue debounce 方法?

    我知道 Vue js 内置了在输入字段上进行反跳的功能 我创建了一个滑块 它触发一个不使用输入字段的方法 我想知道是否可以利用方法内部的去抖功能 除了简单地向输入添加去抖功能之外 是否还可以使用此功能 或者我需要为此编写自己的功能吗 我刚刚
  • 从 web.config 重定向到 root 登录页面

    会话过期时 我将用户重定向到登录页面 Login aspx是在根中 我在 web config 文件中声明了这样的路径
  • PHP“while”循环或另一个“while”循环中的“if”语句?

    我有一个返回 HTML 表的 PHP MySQL 查询 但我被困在需要进行第二个查询的部分while循环该查询 我不知道从这里该去哪里 我尝试了几种不同的方法 我希望它循环并给我第一组数据 然后使用 Order ID 并获取第二组数据并将第
  • 如何在Android智能手机中使用加速度传感器找到位移距离?

    我有一部 Android 智能手机 其中包含加速器传感器 指南针传感器和陀螺仪传感器 我想使用这个传感器计算位移距离 我已经尝试过基本方法 即 final velocity initial velocity acceleration tim
  • 切换仅包含相同文本的 div

    HTML div class event div class clicker click div div class title a href first event a div div div class event div class
  • 检索 Facebook 粉丝姓名

    我正在尝试获取我管理的 Facebook 粉丝页面的粉丝姓名 我做了一些窥探 显然 FB API 不支持这一点 但 Facebook 实际上使用 AJAX JSON 来填充列表 无论如何 任何人都可以建议一种方法来让我自己调用并以纯文本形式
  • 超小屏幕上的居中按钮 Material-UI React 不起作用(justify-xs-center)

    我尝试了一切 但似乎我错过了一些东西 当屏幕特别小时 我花了很多时间在网格内制作一个按钮中心 这段代码工作完美 但问题是我希望我的按钮仅在屏幕特别小时而不是在所有尺寸上居中 工作代码 Grid item xs 12 gt
  • 不显示python OpenCV错误

    我正在使用 OpenCV 和 python 更具体地说findTransformECC的功能cv2执行图像配准 如果算法不收敛 此函数可能会引发错误 我用一个简单的方法捕获了错误try except指令 然后我处理错误 但是 OpenCV
  • 在 Swing 中使用计时器显示图片 5 秒

    我正在尝试使用以下方法为我的应用程序制作登录图片Timer 这个想法是 当用户打开应用程序时 他将看到一张图片 5 秒钟 然后应用程序将启动 我尝试过 正如你在方法中看到的shoutoff To change this license he
  • Facebook 的 Android ProGuard 设置

    我终于找到了为什么我的应用程序崩溃而构建的发布 ProGuard 确实从我的应用程序中剥离了代码 但我通过在 proguard android txt 在 sdk 中找到 中使用 keep 命令手动添加类来阻止这种情况 对于 Faceboo
  • 如何使用 NEST 在 Elasticsearch 中按索引获取所有文档?

    我想通过索引获取所有文档 我已经尝试过以下方法 var response client Search s gt s Index test MatchAll 响应返回 成功操作 但它没有命中任何文档 尽管该索引下有很多文档 To get al
  • npm 在 eslint 报告末尾抛出错误

    我在打字稿项目上运行 eslint 时遇到问题 我有以下 package json 我在其中编写了一个运行 eslint 的脚本 name ts tutorial version 1 0 0 description main index j
  • AngularJS中触发输入文件点击事件

    我正在尝试模拟 AngularJS 中文件输入的单击事件 我见过工作 jQuery 示例 http jsfiddle net fEBFp 1 但我不想使用 jQuery use strict angular module MyApp con
  • type_info 不考虑简历限定符:这是对的吗?

    此代码打印 1 是正确的行为还是 g 4 5 的怪癖 include
  • 共享库构造函数不工作

    在我的共享库中 我必须在加载时进行某些初始化 如果我用 GCC 属性定义函数 attribute constructor 它不起作用 即当加载链接我的共享库的程序时它不会被调用 如果我将函数名称更改为 init 有用 显然使用 init a