Tag: 64bit

在x64 DLL中强制名称修改

我正在将32位应用程序移植到64位。 该应用程序支持DLL的插件。 不幸的是,每个插件需要具有的强制函数之一称为FreeLibrary ,它当然与同名的kernel32 API冲突。 我的插件API使用FreeLibrary名称的原因是该应用程序源自FreeLibrary不与任何OS API冲突的不同平台。 但是,即使在使用FreeLibrary 32位Windows上也不是问题,因为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 rights reserved. kernel32.lib(KERNEL32.dll) : error LNK2005: FreeLibrary already defined in test.o Creating library test.lib and object test.exp test.dll : fatal error LNK1169: one or more multiply defined symbols found 因此,我想知道是否有任何方法强制x64 […]

为什么在64位平台上BSTR长度前缀为4个字节?

似乎在64位平台上,有一个8字节长度的前缀是合理的。 如果我们可以解决超过4Gb的内存,为什么不允许,比如5Gb字符串? 答案只是“按规范”还是存在一些我不知道的互操作性/向后兼容性原因? 谢谢。

如何在/使用Visual Studio 2010为64位Windows构建libcurl?

所以最初,我按照BUILD.WINDOWS.txt的指示,通过创建一个新文件winbuild.bat并将其放在我的curl文件夹的根目录中,我能够获得构建32位的libcurl: CALL “C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat” CD winbuild DEL CURL_OBJS.inc DEL LIBCURL_OBJS.inc DEL vc100.idb nmake /f Makefile.vc mode=dll VC=10 ENABLE_WINSSL=yes GEN_PDB=yes MACHINE=X86 CD .. EXIT /B 0 然后我从现有代码转到File / New / Project … / Visual C ++ /使用外部构建系统/构建命令行:winbuild.bat。 我尝试使用winbuild64.bat在我的x64属性中创建一个新平台: CALL “C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat” CD winbuild DEL CURL_OBJS.inc DEL LIBCURL_OBJS.inc DEL […]

64位随机发生器的种子

我目前正在运行一个带有8个以上管道(线程)的multithreading仿真应用程序。 这些管道运行非常复杂的代码,该代码依赖于种子生成的随机序列。 然后将序列归结为单个0/1。 在将种子从主线程传递到处理管道之后,我希望这种“随机处理”是100%确定性的。 所以,我可以在第二次运行中复制结果。 所以,例如:(我有这个编码,它的工作原理) Pipe 1 -> Seed: 123 -> Result: 0 Pipe 2 -> Seed: 123 -> Result: 0 Pipe 3 -> Seed: 589 -> Result: 1 当我需要运行100M或更多这些过程然后平均结果时,就会出现问题。 可能只有100M中的1个是1,其余的都是0.很明显,我不能用32bit种子为srand() 100M随机值。 是否可以使用VS2010中的64位种子播种srand(),或使用等效方法? rand()在2 ^ 32之后重复自身还是没有(有一些内部隐藏状态)? 谢谢

在具有32位二进制文​​件的64位机器上编译ac程序

我目前正在尝试使用libssh.dll库来实现应该连接到远程计算机的ac程序。我正在使用gcc来编译程序。 编译此程序时,我收到此错误: i386 architecture of input file ‘libssh/bin/libssh.ddl’ is incompatible with i386:x86-64 output 我尝试用-m32标志编译程序,但后来我收到这些错误: /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.8.2//libgcc_s.dll.a when searching for -lgcc_s /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.8.2//libgcc.a when searching for -lgcc /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../libcygwin.a when searching for -lcygwin /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/libgcc_s.dll.a when searching for -lgcc_s /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.8.2//libgcc.a when searching for -lgcc 有任何想法如何解决这个问题?

如何BSWAP低32位的64位寄存器?

我一直在寻找如何将BSWAP用于64位寄存器的低32位子寄存器的答案。 例如, 0x0123456789abcdef在RAX寄存器中,我想用一条指令将其更改为0x01234567efcdab89 (因为性能)。 所以我尝试了以下内联函数: #define BSWAP(T) { \ __asm__ __volatile__ ( \ “bswap %k0” \ : “=q” (T) \ : “q” (T)); \ } 结果是0x00000000efcdab89 。 我不明白为什么编译器就像这样。 有人知道有效的解决方案吗?

为什么INT64_MIN的定义不同? 为什么他们的行为不同?

我公司的stdint.h标题是: #define INT64_MIN -9223372036854775808LL 但在我项目的一些代码中,程序员写道: #undef INT64_MIN #define INT64_MIN (-9223372036854775807LL -1) 然后他在代码中使用此定义。 该项目编译时没有警告/错误。 当我试图删除他的定义并使用默认定义时,我得到了: error: integer constant is so large that it is unsigned 这两个定义似乎是等价的。 为什么一个编译好,另一个失败?

ASM x64 scanf printf double,GAS

我无法弄清楚为什么这段代码对我不起作用。 我需要使用scanf函数用于double,然后printf用于相同的double。 使用此代码时结果不佳。 我看到的是相当随机的字符。 .data d1: .double format: .asciz “%lf\n” format2: .asciz “%lf” .text .globl main main: subq $8, %rsp #scanf movq $0, %rax movq $d1, %rsi movq $format2, %rdi call scanf addq $16, %rsp #printf movq $1, %rax movsd d1, %xmm0 movq $format, %rdi call printf addq $16, %rsp #exit movq $1, %rdi xorq […]

Solaris 11 / Illumos / OmniOS:哪个软件包有/usr/include/sys/types.h?

Ubuntu的等价物是libc6-dev ,但我似乎无法在Solaris上找到它? 如何在Solaris或Illumos上获取用于构建包的types.h和相关文件?

这个汇编声明是什么意思?

我正在使用-s标志查看gcc生成的汇编代码。 一些陈述如下所示。 movl is_leader(%rip), destination 这里, is_leader是C代码中int类型的全局定义变量。 我不明白的是这里的术语是is_leader(%rip) 。 是不是翻录指令指针? 我需要知道这个语句是如何用来访问is_leader的 。