强制在x64 DLL中混用名称
我正在将32位应用程序移植到64位.该应用程序支持DLL的插件.不幸的是,每个插件需要具有的强制函数之一称为FreeLibrary当然,哪个插件与同名的kernel32 API冲突.我的插件API使用FreeLibrary名称的原因是该应用程序源自FreeLibrary不与任何OS API冲突的其他平台上. 但是,即使在32位窗口上使用FreeLibrary也不是问题,因为32位dll使用名称杂交,即该函数被存储为_FreeLibrary,因此与kernel32 api不会发生冲突. 在64位上,我现在有一个问题,因为64位似乎没有使用名称.在64位上,编译器创建了一个名为FreeLibrary的符号,这当然与同名kernel32 API发生冲突并拒绝链接,从而导致以下错误: Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All r
2 2024-04-10
编程技术问答社区
用extern "C "来包装一个C语言库,除了一个内部的C++包含之外。
我有一个我需要在C ++代码中使用的C库,因此我需要用extern "C"块包装整个LIB.问题在于库似乎包含一个C ++编译的代码,因此包装整个LIB也将包装C ++标头. 在 内部lib.h我只包括我要曝光的所有内部标题,类似的东西: #ifndef LIB_H #define LIB_H #include "lib_foo.h" #include "lib_bar.h" #include "lib_baz.h" #endif 因此,客户只需要包括lib.h即可使用lib. 在我的第一次尝试中,我已经做到了: #ifndef LIB_H #define LIB_H extern "C" { #include "lib_foo.h" #include "lib_bar.h" #include "lib_baz.h" } #endif 但是,当我执行already_compiled_c++.h内部的任何函数时,我会遇到一个符号查找错误.
6 2024-04-09
编程技术问答社区
假设我不使用任何重载函数,有什么办法可以阻止所有的名称混淆吗?
标题几乎说明了一切.我知道我可以使用和外部" C"块停止乱七八糟(尽管我不确定应该放在哪里说块),但是有什么方法可以使整个程序禁用它吗?如果我这样做,那将使从代码中编译的库更易于使用Luajit的FFI? 编辑:据说这是特定于DLL和Visual C ++编译器的问题.我只是在问一个通用的C ++问题. 解决方案 您提到的是使用extern "C" { }语法禁用名称杂交以包围函数声明,您不愿意 的名称 extern "C" { int foo(int x, int y); void bar(const char* cstr); } ,如果您确定不使用任何C ++特定功能,则更简单的方法是使用C-Compiler来编译代码.例如GCC工具链调用gcc而不是g++. 更新: extern方法的优点是,您仍然可以使用C ++功能进行实现(在单独的.cpp汇编单元中),当将代码编译为纯C代码时,当然是不可能的.例如 #include "My
14 2024-04-08
编程技术问答社区
我怎样才能在Linux上看到(C和C++)二进制的符号?
你们使用哪些工具? Demangle C ++符号如何能够将其传递给Profiler工具,例如谢谢 解决方案 使用nm查看所有符号,c++filt删除. 示例: nm -an foo | c++filt 其他解决方案 我使用的分析工具已经知道符号和源代码,因为它只是调试器.即使有完整的优化,我也可以构建具有包含符号的应用程序.
8 2024-04-07
编程技术问答社区
纠结/解构函数的功能
我以前有,在这里,表明C ++功能并不容易在组装中表示.现在,我有兴趣以一种或另一种方式阅读它们,因为Valgrind的一部分Callgrind在组装中显示它们被删除. . 因此,我想拧紧Valgrind函数输出,或者将函数的汇编名称删除.有人尝试过这样的事情吗?我正在寻找一个网站并找到了以下内容: Code to implement demangling is part of the GNU Binutils package; see libiberty/cplus-dem.c and include/demangle.h. 有人尝试过这样的事情吗?我想在c. 中删除/mangle 我的编译器是GCC 4.x. 解决方案 使用c++filt命令行工具将名称删除. 其他解决方案 这是我的C ++ 11实现,是从下一页得出的: #include // needed for abi::__cxa_demangle std
6 2024-04-06
编程技术问答社区
关于C++中名称混淆的问题
我正在尝试学习和理解C ++的名称.这是一些问题: (1)来自 devx 当全局函数被超载时,每个过载版本的生成的杂交名称都是唯一的.名称杂交也适用于变量.因此,具有相同用户名称的本地变量和一个全局变量仍然具有不同的杂种名称. 除了超载函数以及同名全局和本地变量外,还有其他示例还使用名称操作吗? (2)来自 wiki 只要语言允许使用相同标识符命名的不同实体,只要它们占据不同的名称空间(通常由模块,类或显式命名空间指令定义的名称空间).). ). 我不太了解为什么只将标识符属于不同名称空间的案例应用于案例,因为超载函数可以在同一命名空间中,而同一名称的全局和本地变量也可以在同一空间中.如何理解这一点? 做具有相同名称的变量,但在不同的范围中也使用名称杂交? (3)C有名字杂交吗?如果没有,当某些全球变量和局部变量具有相同名称时,它如何处理情况? C没有超载功能,对吧? 谢谢! 解决方案 c不做任何名称的杂物,尽管它确实预先伪
6 2024-04-06
编程技术问答社区
如何阻止我的DLL'的导出函数的名称混淆?
我正在尝试创建一个DLL,该dll导出一个称为" getName"的函数.我希望其他代码能够调用此函数,而不必知道操纵功能名称. 我的标题文件看起来像这样: #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif EXPORT TCHAR * CALLBACK GetName(); 我的代码看起来像这样: #include #include "PluginOne.h" int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { return TRUE ; } EXPORT TCHAR * CALLBACK GetName() { return T
18 2024-04-06
编程技术问答社区
如何列出.so文件中的符号?
如何列出从.so文件导出的符号?如果可能的话,我也想知道它们的来源(例如,如果它们是从静态库中拉入的). 我正在使用GCC 4.0.2,如果有所不同. 解决方案 列表符号的标准工具是nm,您可以像这样使用它: nm -gD yourLib.so 如果您想查看C ++库的符号,请添加删除符号的" -c"选项(它更可读性的删除). nm -gDC yourLib.so 如果您的.SO文件为ELF格式,则有两个选择: objdump(-C也对脱孔C ++也很有用): $ objdump -TC libz.so libz.so: file format elf64-x86-64 DYNAMIC SYMBOL TABLE: 0000000000002010 l d .init 0000000000000000 .init 0000000000000000 DF *UND* 0000000000
12 2024-04-05
编程技术问答社区
C++中extern "C "的作用是什么?
将extern "C"放入C ++代码到底是什么? 例如: extern "C" { void foo(); } 解决方案 extern "C"在C ++中制作功能名称具有C链接(编译器不操名称),以便客户端C代码可以使用仅包含的C兼容标头文件链接到(使用)函数声明您的功能.您的函数定义以二进制格式(由您的C ++编译器编译)包含,然后客户c链接器将链接到使用C名称. 由于C ++具有函数名称的过载,并且C没有,因此C ++编译器不能仅将函数名称用作链接到链接的唯一ID,因此它通过添加有关参数的信息来操纵名称. C编译器不需要操纵名称,因为您无法在C中过载函数名称. . 您知道,您可以明确指定extern "C"链接到每个单独的声明/定义,或使用块将声明/定义的顺序分组为具有一定的链接: extern "C" void foo(int); extern "C" { void g(char); int i; } 如果您关心这些技术,
12 2024-04-05
编程技术问答社区
python 如何使用 setattr 或 exec 创建私有类变量?
我刚刚遇到了 pseudo - 私有的类成员名称使用setattr或exec>. In [1]: class T: ...: def __init__(self, **kwargs): ...: self.__x = 1 ...: for k, v in kwargs.items(): ...: setattr(self, "__%s" % k, v) ...: In [2]: T(y=2).__dict__ Out[2]: {'_T__x': 1, '__y': 2} 我也尝试了exec("self.__%s = %s" % (k, v)),结果相同: In [1]: class T: ...: def __init__(self, **kwargs): ...: self.__x = 1 ...: for
6 2024-03-19
编程技术问答社区
"私有 "名称的混用和实例与类的属性
我正在写一个需要访问私人变量并发现这种差异的装饰师.谁能解释一下? (Python 2.5) 命名杂交按预期的属性工作: 中定义的属性 >>> class Tester(object): ... __foo = "hi" >>> t = Tester() >>> t._Tester__foo 'hi' 实例属性不起作用(这是我们应该这样做的方式吗?) >>> class Tester(object): ... def __init__(self): ... self.__foo = "hi" >>> t = Tester() >>> t._Tester__foo AttributeError: 'Tester' object has no attribute '_Tester__foo' P.S. " class属性"是否适合这些?它们不是静态的,但是如果您将其中之一列为列表或其他一些可变类型,则可以共享... 更新
12 2024-03-19
编程技术问答社区
GCC链接/符号名称与C++和汇编文件的混淆
我在编译和链接的库中遇到了一些麻烦,该库用我的程序代码在C ++中编写.就我而言,使用AVR-GCC套件适用于AVR微控制器,但我想这个问题通常适用于GCC. 我可以从C ++源和汇编中构建的.o文件,但是链接它们会出现错误: > avr-gcc -mmcu=attiny84 -lm -o obj\AvrTest.elf obj\Main.o obj\i2cmaster.o obj\Main.o: In function `main': Main.cpp:(.text+0x0): undefined reference to `i2c_init()' 这是Uber-simple Main.cpp代码: #include "i2cmaster.h" void main() { i2c_init(); while ( true ) { } } i2cmaster.h定义这样的函数原型: extern void i2c_init(voi
4 2024-03-17
编程技术问答社区
为什么我的汇编输出中有两个析构器的实现?
我的.o文件的 和objdump揭示了我对同一类有两个不同的破坏者.为什么? Disassembly of section .text._ZN1AD0Ev: 0000000000000000 : 0: 53 push %rbx 1: be 00 00 00 00 mov $0x0,%esi 6: 48 89 fb mov %rdi,%rbx 9: 48 c7 07 00 00 00 00 movq $0x0,(%rdi) 10: ba 2c 00 00 00 mov $0x2c,%edx 15: bf 00 00 00 00 mov $0x0,%edi 1a: e8 00 00 00 00 callq 1f
14 2024-03-17
编程技术问答社区
防止在Ada DLL中出现混杂的名称
有没有一种简单的方法来防止ADA名称创建ADA DLL时被弄脏? 这是我的.ADB代码 with Ada.Text_IO; package body testDLL is procedure Print_Call is begin Ada.Text_IO.Put_Line("Hello World"); end Print_Call; function Add_Nums(A,B : in Integer) return Integer is begin return A + B; end Add_Nums; end testDLL; 我的.ads package testDLL is procedure Print_Call; pragma export (dll, Print_Call, "Print_Call"); function Add_Nums(A,B : in Integ
12 2024-01-10
编程技术问答社区
C++的64位名称混用
我有一些代码,该代码具有以下行 #pragma comment(linker, "/include:_test@12") 当我使用C ++ Visual Studio 2010与配置类型32bit编译代码时,使用此代码的项目正常运行(我也在32位Windows机器上). 我将机器更改为64位并使用X64配置时会遇到链接错误,并使用C ++ Visual Studio编译. C ++名称在32位与64位不同吗?如果是这样,我在哪里可以找到64位C ++名称杂交约定? 解决方案 是的,名称Mangling在32和64位之间有所不同.涵盖确切格式的合理文章可以是在这里找到.但是,您可以很快地分配到目标并检查所得的地图文件,从而很快分辨出主要差异.从我的经验中 简单样本:void foo(); 32bit: ?foo@A@@QAEXXZ 64bit: ?foo@A@@QEAAXXZ 对于非响应性的性病调用,长度后缀可能会大不相同,具体取决于参数堆栈
18 2024-01-09
编程技术问答社区
x64 DLL导出函数名称
我正在尝试将32位DLL(和应用程序)移植到64位,并且我设法在没有错误的情况下构建了它.当尝试使用我的64位应用程序加载它时,我注意到导出的功能名称不同.这就是我导出函数的方式: #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) long __stdcall Connect(char * name, long size); #ifdef __cplusplus } #endif 在依赖关系沃克中,导出的功能具有以下格式: 32位:_Connect@8 64位:Connect 在应用程序中使用dll i明确加载dll(LoadLibrary成功),但GetProcaddress失败了64位,因为它找不到带有提供名称的函数. 在我们的应用程序中,我将功能名称保留如下: #define ConnectName "_Connect@8" ... GetProcAddress(D
12 2024-01-09
编程技术问答社区
winapi从一个函数的地址中获取混杂的名称。
在我的C ++应用程序中,我有函数的虚拟地址,我想获得他们的杂交名称. 现在,我只能使用Winapi SymFromAddr函数获得未直的名称. 有没有办法可以获取被弄糊的名称? 解决方案 使用 SymsetOptions().您想关闭SYMOPT_UNDNAME选项以查看杂乱无章的名称. 所以,大致: DWORD options = SymGetOptions(); SymSetOptions(options & ~SYMOPT_UNDNAME); if (SymFromAddr(hProcess, dwAddress, &dwDisplacement, pSymbol)) { // etc... } SymSetOptions(options);
10 2023-12-04
编程技术问答社区
有什么办法可以抑制c++名称的混淆吗?
我有一个用C ++编写的DLL,我想抑制一些导出方法的名称.这些方法是全局的,不是任何类的成员.有没有办法实现这一目标? btw:我正在使用VS2008. 解决方案 " bradtgmurray"是正确的,但是对于Visual C ++编译器,您需要明确导出您的功能.但是使用" Serge -appTranslator"提出的.def文件是错误的方法. 在Visual C ++上导出符号的通用方法是什么? 使用对C和C ++代码都可以使用的DELDSPEC(DLLEXPORT/DLLIMPORT)指令(是否装饰) 因此,在Visual C ++中导出未装修函数的正确方法正在组合" C"成语,如" Bradtgmurray"和Dllimport/dllexport关键字. . 一个例子? 作为一个例子,我在Visual C ++上创建了一个空的DLL项目,并编写了两个功能,一个称为CPP,因为它被装饰了,另一个则是CPP,另一个是CPP,因为不是.代码
24 2023-12-04
编程技术问答社区
使用extern c和dllexport与模块定义的stdcall名称混淆(msvc++)
我试图导出一个简单的测试功能,以使DLL与应用程序(FYI:MIRC)一起使用,该应用程序指定调用约定为: int __stdcall test_func(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause) 现在,要从应用程序调用它,我会使用 test_func ,但我注意到由于名称而注意到它并不像我想象的那样简单. 通过类似的主题,我已经了解到,使用 extern" c" 与 __ extspec(dllexport)结合使用是一种emove夫的方法到模块定义(.def).但是,当使用extern/dllexport方法时,我的函数(例如)始终 _test_func@numbers ,而.def删除了与我需要导出到的应用程序所需的所有操作. 有人可以解释为什么这是吗?我只是对这两种方法感到好奇.谢谢! 解决方案 dllexport/导入设计为自己加载,而不是使用getP
24 2023-11-20
编程技术问答社区
虽然符号存在于*.so文件中,但g++未定义引用
我找到了许多类似的问题(例如 this , that 或 this ),但是它们都没有帮助我解决了问题.我有一个 *.so文件(来自 gnss-sdr ),如下所示: $nm libgnss_system_parameters_dyn.so | c++filt |grep Gps_Eph 包含符号Gps_Ephemeris::Gps_Ephemeris(),它应该是构造函数. 我写了一些最小代码: #include #include int main(int argc,const char* argv[]) { Gps_Ephemeris ge; return 0; } 我编译的: g++ main.cpp -std=c++0x -I some_include_path -L some_lib_path -l gnss_syst
16 2023-11-06
编程技术问答社区