有没有什么办法,以取代在库中的函数?

我的工作与定义其内部分裂运营商脚本语言库。 遗憾的是它并没有零检查除数。 这导致了许多烦恼。 我知道经营者的签名。

double ScriptClass::Divide(double&, double&);

可悲的是它甚至不是一个C函数。 有没有什么办法,我可以让我的应用程序中使用自己的Divide函数,而不是ScriptClass::Divide功能?

编辑:我知道dlopen(NULL,..)和用户定义的那些取代“C”的功能。 可用于类成员函数这样做(没有求助于利用错位的名称)?

--------------解决方案-------------

一般来说它是由程序员,而不是基本的除法运算器,以防止被零除。 如果你除以零了很多,这似乎表明该算法在一个可能的漏洞被使用。 考虑返工的算法,如果这不是一个选项,门卫要求来划分以零检查。 你甚至可以做一个内部protected_divide函数类型。

之所以这么说,假设因为它看起来像一个C ++函数必须++库编译你使用来构建应用程序,以便名称重整的比赛,你也许可以重新定义功能到所有相同的选项为C .so和使用LD_PRELOAD来强制加载。 如果静态链接, 想你可以创建功能到自己.o文件和链接,此前库本身会导致链接器拿起你的版本。

LD_PRELOAD是你的朋友。 作为一个例子,请看:

http://www.ibm.com/developerworks/linux/library/l-glibc.html

多种连接和动态连接器实现将提供的东西,看起来像一个解决方案,这一点,正如其他人提及。

但是,如果你重新定义一种C使用任何这些特征++函数(GNU LD的--wrap,ld.so的LD_PRELOAD,等等), 你违反了一个定义规则 ,并因此调用不确定的行为。

虽然编译库,编译器允许内联有问题的功能,因为它认为合适的,这意味着你的函数的重新定义可能不会在所有情况下被调用的任何方式。

考虑下面的代码:

class A
{
public:
void foo();
void bar();
};

void A::foo()
{
std::cout << "Old version.\n";
}

void A::bar()
{
foo();
}

GCC 4.5,与-O3调用,实际上将决定内联富()进入巴()的定义。 如果你以某种方式做出你自己的,A :: bar()中仍然会输出字符串“旧版本。\ N”的定义你的连接器取代A :: foo的()这个定义。

所以,一句话:没有。

有没有让远离错位的名称,我不觉得,但可以使用LD的--wrap选项,以使特定的功能被赋予基于旧名称的新名称。 然后,您可以编写一个新的版本,并转发到旧版本太多,如果你喜欢。

快速浏览这里:

http://linux.die.net/man/1/ld

我用这个在过去挂接到malloc等),而无需重新编译运行时库,虽然这不是在Linux上(这是没有运行时加载的嵌入物)。 我没有用它来包装C ++的功能,但如果你能处理的C ++调用约定在某种程度上,你可以创建与原函数的重整名称的函数,让编译器接受一个函数调用,有一些丑陋在很有趣字符的名字......我不明白为什么它不应该是能够使它发挥作用。

只是简短的问答,斜面你只是包装类使用自己的代码? 它会出现一些头痛的开始,但之后比你可以简化很多功能。

(甚至只是换了宏的功能)

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,LINUX,G ++
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 5.204 (s). 10 q(s)