x86-64 Linux 中不再允许使用 32 位绝对地址?

2024-04-27

64 位 Linux 默认使用小内存模型,将所有代码和静态数据置于 2GB 地址限制以下。这确保您可以使用 32 位绝对地址。旧版本的 gcc 对静态数组使用 32 位绝对地址,以便节省相对地址计算的额外指令。然而,这不再有效。如果我尝试在汇编中创建 32 位绝对地址,则会出现链接器错误: “创建共享对象时,不能使用针对‘.data’的重定位 R_X86_64_32S;使用 -fPIC 重新编译”。 当然,此错误消息具有误导性,因为我没有创建共享对象,并且 -fPIC 没有帮助。 到目前为止我发现的是:gcc 版本 4.8.5 对静态数组使用 32 位绝对地址,gcc 版本 6.3.0 则没有。版本 5 可能也没有。 binutils 2.24 中的链接器允许 32 位绝对地址,而 2.28 版本则不允许。

这一变化的结果是旧的库必须重新编译并且遗留的汇编代码被破坏。

现在我想问:这个改变是什么时候发生的?它记录在某处吗?是否有一个链接器选项可以使其接受 32 位绝对地址?


您的发行版配置了 gcc--enable-default-pie,因此默认情况下它会生成位置无关的可执行文件(允许可执行文件和库的 ASLR)。如今,大多数发行版都在这样做。

你其实are制作共享对象:PIE 可执行文件是一种使用带有入口点的共享对象的 hack。动态链接器已经支持这一点,并且 ASLR 非常适合安全性,因此这是为可执行文件实现 ASLR 的最简单方法。

32-bit absolute relocations aren't allowed in an ELF shared object; that would stop them from being loaded outside the low 2GiB (for sign-extended 32-bit addresses). 64-bit absolute addresses are allowed, but generally you only want that for jump tables or other static data, not as part of instructions.1

The recompile with -fPIC部分错误消息对于手写 asm 来说是伪造的;它是为人们编译的情况而写的gcc -c然后尝试链接gcc -shared -o foo.so *.o,与 gcc 其中-fPIE is not默认值。错误消息可能应该更改,因为许多人在链接手写汇编时遇到此错误。

正确的解读方式recompile with -fPIC is "制作与 PIE 兼容的新 asm",或者使用 C 源代码的编译器,或者如果您的源代码是 asm,则使用手动编译器。


如何使用 RIP 相对寻址:基础知识

对于没有任何缺点的简单情况,始终使用 RIP 相对寻址。另请参阅下面的脚注 1 和这个语法的答案 https://stackoverflow.com/questions/54745872/how-do-rip-relative-variable-references-like-rip-a-in-x86-64-gas-intel-sy。仅当绝对寻址实际上对代码大小有帮助而不是有害时才考虑使用绝对寻址。例如NASM default rel在你的文件的顶部。

美国电话电报公司foo(%rip)或在气体中.intel_syntax noprefix use [rip + foo].


禁用 PIE 模式以使 32 位绝对寻址工作

Use gcc -fno-pie -no-pie将其覆盖回旧行为。 -no-pie是链接器选项,-fno-pie是代码生成选项 https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html。仅与-fno-pie, gcc 将使代码如下mov eax, offset .LC0不与仍然启用的-pie.

(clang可以默认启用 PIE,以便:使用clang -fno-pie -nopie. A 2017年7月补丁 https://reviews.llvm.org/D35462 made -no-pie的别名-nopie,为了与gcc兼容,但clang4.0.1没有。)


64 位(次要)或 32 位代码(主要)的 PI​​E 性能成本

仅与-no-pie,(但仍然-fpie)编译器生成的代码(来自 C 或 C++ 源代码)将比必要的速度稍慢且稍大,但仍会链接到位置相关的可执行文件,该可执行文件不会从 ASLR 中受益。“太多的 PIE 不利于性能”据报告,SPEC CPU2006 上的 x86-64 平均速度下降 3% https://security.stackexchange.com/questions/41697/why-doesnt-linux-randomize-the-address-of-the-executable-code-segment/42641#42641(我没有该论文的副本,因此不知道该硬件是什么:/)。但在 32 位代码中,平均速度减慢为 10%,最坏情况为 25%(在 SPEC CPU2006 上)。

PIE 可执行文件的惩罚主要是针对诸如索引静态数组之类的内容,正如 Agner 在问题中所描述的那样,其中使用静态地址作为 32 位立即数或作为[disp32 + index*4]与 RIP 相关的 LEA 相比,寻址模式可以保存指令和寄存器以将地址存入寄存器。也是5字节mov r32, imm32而不是 7 字节lea r64, [rel symbol]将静态地址放入寄存器对于将字符串文字或其他静态数据的地址传递给函数来说是很好的。

-fPIE仍然假设全局变量/函数没有符号插入,这与-fPIC对于必须通过 GOT 访问全局变量的共享库(这是使用的另一个原因static对于任何可以限制在文件范围而不是全局范围的变量)。看Linux 上动态库的令人遗憾的现状 https://web.archive.org/web/20171111043629/http://www.macieira.org/blog/2012/01/sorry-state-of-dynamic-libraries-on-linux/.

Thus -fPIE-fPIC对于 64 位代码,但仍然对于 32 位不利,因为 RIP 相对寻址不可用. See Godbolt 编译器资源管理器上的一些示例 https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(j:1,source:%27%23include+%3Cstdio.h%3E%0A//+godbolt+doesn!%27t+build+gcc+with+--enable-default-pie%0A//+so+-fno-pie+-no-pie+is+the+default.%0A%0A//+-fPIE+mostly+just+costs+you+RIP-relative+LEA%0A//+-fPIC+is+even+more+expensive+than+-fPIE+for+global+vars,%0A//++requiring+a+load+to+get+the+address+of+a+global%0A%0A%0A//__attribute__((weak))+extern+int+ext%3B++//+PIE+can!%27t+assume+its+definition+wins,+so+the+address+isn!%27t+a+link-time+constant+anymore%0A%0A//+overhead+only+with+PIC.++RIP-relative+is+already+good+for+static+data%0A//+static++//+would+remove+PIC+overhead%0A++int+ext+%3D+1%3B%0Aint*+scalar_global(void)+%7B%0A++ext+%3D+123%3B%0A++//return+%26ext%3B++//+minor+PIC/PIE+overhead%0A++return+NULL%3B%0A%7D%0A%0A//+overhead+with+PIE,+more+overhead+with+PIC+(dependent+load)%0A//+no-pic+can+use+the+address+as+a+disp32+for+an+indexed+addressing+mode%0Aint+arr%5B1024%5D%3B%0Aint+fetch(long+idx)+%7B%0A++return+arr%5Bidx%5D%3B%0A%7D%0A%0A//+PIE+and+PIC+both+use+a+RIP-relative+LEA+for+the+string+literal%0A//+instead+of+mov-immediate+(smaller+and+runs+on+more+ports)%0A//+-fno-plt+works+the+same+for+no-pie,+pie,+and+pic%0A//+Even+no-pie+executables+still+call+shared+libs+through+the+PLT+by+default%0Avoid+call_sharedlib(void)+%7B%0A++puts(%22hello%22)%3B%0A%7D%0A//+jmp+puts++turns+into+puts@PLT+when+the+linker+finds%0A//+the+puts+symbol+in+libc.so+instead+of+a+static+library.%0A%27),l:%275%27,n:%270%27,o:%27C%2B%2B+source+%231%27,t:%270%27)),k:34.28344416186805,l:%274%27,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((g:!((h:compiler,i:(compiler:g72,filters:(b:%270%27,binary:%271%27,commentOnly:%270%27,demangle:%270%27,directives:%270%27,execute:%271%27,intel:%270%27,trim:%271%27),libs:!(),options:%27-xc+-Wall+-O3++-fno-pie+-no-pie%27,source:1),l:%275%27,n:%270%27,o:%27x86-64+gcc+7.2+(Editor+%231,+Compiler+%233)%27,t:%270%27)),header:(),l:%274%27,m:50,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((h:compiler,i:(compiler:g72,filters:(b:%270%27,binary:%271%27,commentOnly:%270%27,demangle:%270%27,directives:%270%27,execute:%271%27,intel:%270%27,trim:%271%27),libs:!(),options:%27-xc+-std%3Dc99+-O3+-fPIE+-no-pie%27,source:1),l:%275%27,n:%270%27,o:%27x86-64+gcc+7.2+(Editor+%231,+Compiler+%231)%27,t:%270%27)),k:33.18220551902322,l:%274%27,m:50,n:%270%27,o:%27%27,s:0,t:%270%27)),k:33.21998747260075,l:%273%27,n:%270%27,o:%27%27,t:%270%27),(g:!((g:!((h:compiler,i:(compiler:g72,filters:(b:%270%27,binary:%271%27,commentOnly:%270%27,demangle:%270%27,directives:%270%27,execute:%271%27,intel:%270%27,trim:%271%27),libs:!(),options:%27-xc+-Wall+-O3++-fPIC%27,source:1),l:%275%27,n:%270%27,o:%27x86-64+gcc+7.2+(Editor+%231,+Compiler+%232)%27,t:%270%27)),header:(),k:32.49656836553122,l:%274%27,m:50,n:%270%27,o:%27%27,s:0,t:%270%27),(g:!((h:compiler,i:(compiler:g72,filters:(b:%270%27,binary:%271%27,commentOnly:%270%27,demangle:%270%27,directives:%270%27,execute:%271%27,intel:%270%27,trim:%271%27),libs:!(),options:%27-xc+-Wall+-O3++-fno-plt+-fPIC%27,source:1),l:%275%27,n:%270%27,o:%27x86-64+gcc+7.2+(Editor+%231,+Compiler+%234)%27,t:%270%27)),header:(),l:%274%27,m:50,n:%270%27,o:%27%27,s:0,t:%270%27)),k:32.49656836553122,l:%273%27,n:%270%27,o:%27%27,t:%270%27)),l:%272%27,n:%270%27,o:%27%27,t:%270%27)),version:4。一般,-fPIE在 64 位代码中,性能/代码大小方面的缺点非常小。特定循环的最坏情况可能只有百分之几。但 32 位 PIE 可能会更糟。

都不是-f代码生成选项在链接时会产生任何影响, 或者组装时.S手写汇编。gcc -fno-pie -no-pie -O3 main.c nasm_output.o是您想要两种选择的情况。


检查您的 GCC 配置

如果你的 GCC 是这样配置的,gcc -v |& grep -o -e '[^ ]*pie'印刷--enable-default-pie。对此配置选项的支持已添加到 gcc 中2015年初 https://gcc.gnu.org/ml/gcc-patches/2015-01/msg00701.html。 Ubuntu 在 16.10 中启用了它,Debian 大约在同一时间在 gcc 中启用了它6.2.0-7(导致内核构建错误:https://lkml.org/lkml/2016/10/21/904 https://lkml.org/lkml/2016/10/21/904).

有关的:将压缩的 x86 内核构建为 PIE https://lkml.org/lkml/2016/10/20/141也受到更改后的默认值的影响。

为什么Linux不随机化可执行代码段的地址? https://security.stackexchange.com/questions/41697/why-doesnt-linux-randomize-the-address-of-the-executable-code-segment是一个较老的问题,关于为什么它不是早期的默认设置,或者在全面启用它之前仅对旧版 Ubuntu 上的几个软件包启用。


注意ld本身并没有改变它的默认值。它仍然可以正常工作(至少在带有 binutils 2.28 的 Arch Linux 上)。变化在于gcc默认为通过-pie作为链接器选项,除非您明确使用-static or -no-pie.

在 NASM 源文件中,我使用了a32 mov eax, [abs buf]获得绝对地址。 (我正在测试是否用 6 字节方式编码小绝对地址(地址大小 + mov eax,moffs:67 a1 40 f1 60 00)在 Intel CPU 上出现 LCP 停顿。It does https://bugs.llvm.org/show_bug.cgi?id=34733#c3.)

nasm -felf64 -Worphan-labels -g -Fdwarf testloop.asm &&
ld -o testloop testloop.o              # works: static executable

gcc -v -nostdlib testloop.o            # doesn't work
...
..../collect2  ... -pie ...
/usr/bin/ld: testloop.o: relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status

gcc -v -no-pie -nostdlib testloop.o    # works
gcc -v -static -nostdlib testloop.o    # also works: -static implies -no-pie

GCC 还可以制作一个“静态 PIE”-static-pie; ASLRed 没有动态库或 ELF 解释器。不一样的东西-static -pie- 尽管这些相互冲突(你得到一个静态的非 PIE)它可能会改变 https://gcc.gnu.org/ml/gcc/2018-01/msg00255.html.

有关的:使用/不使用 libc 构建静态/动态可执行文件,定义_start or main https://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64-bit-system-gnu-toolchain/36901649.


检查现有可执行文件是否为 PIE

这也被问到:如何测试 Linux 二进制文件是否被编译为位置无关代码? https://unix.stackexchange.com/questions/89211/test-whether-linux-binary-is-compiled-as-position-independent-code

file and readelf说 PIE 是“共享对象”,而不是 ELF 可执行文件。 ELF类型的EXEC不能是PIE。

$ gcc -fno-pie  -no-pie -O3 hello.c
$ file a.out
a.out: ELF 64-bit LSB executable, ...

$ gcc -O3 hello.c
$ file a.out
a.out: ELF 64-bit LSB shared object, ...

 ## Or with a more recent version of file:
a.out: ELF 64-bit LSB pie executable, ...

gcc -static-pie是 GCC 默认情况下不做的一件特殊事情,即使-nostdlib。它显示为LSB pie executable, dynamically linked当前版本的file. (See Linux ldd 中的“静态链接”和“不是动态可执行文件”有什么区别? https://stackoverflow.com/questions/61553723/whats-the-difference-between-statically-linked-and-not-a-dynamic-executable)。它具有ELF型DYN,但是readelf显示没有.interp, and ldd会告诉你它是静态链接的。广东发展银行starti and /proc/maps确认执行从其顶部开始_start,不在 ELF 解释器中。



半相关(但不是真的):另一个最近的 gcc 功能是gcc -fno-plt。最后调用共享库可以是call [rip + symbol@GOTPCREL](美国电话电报公司call *puts@GOTPCREL(%rip)),没有 PLT 蹦床。

NASM 版本是call [rel puts wrt ..got]
作为替代call puts wrt ..plt. See 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数 https://stackoverflow.com/questions/52126328/cant-call-c-standard-library-function-on-64-bit-linux-from-assembly-yasm-code。这适用于 PIE 或非 PIE,并避免链接器为您构建 PLT 存根。

一些发行版已经开始启用它。它还避免了需要可写+可执行的内存页面,因此有利于防止代码注入的安全性。 (我认为现代 PLT 实现也不需要,只需更新 GOT 指针而不是重写jmp rel32说明,因此可能不存在安全差异。)

对于进行大量共享库调用的程序来说,这是一个显着的加速,例如x86-64clang -O2 -g在任何硬件上编译tramp3d从41.6秒到36.8秒补丁作者测试过 https://gcc.gnu.org/ml/gcc-patches/2015-05/msg00225.html。 (clang 可能是共享库调用的最坏情况,会对小型 LLVM 库函数进行大量调用。)

它确实需要早期绑定而不是惰性动态链接,因此对于立即退出的大程序来说速度较慢。 (例如。clang --version或编译hello.c)。显然,通过预链接可以减少这种减速。

不过,这并不能消除共享库 PIC 代码中外部变量的 GOT 开销。 (请参阅上面的 godbolt 链接)。


脚注 1:64 位绝对

Linux ELF 共享对象实际上允许使用 64 位绝对地址,其中文本重定位 https://blog.flameeyes.eu/2016/01/textrels-text-relocations-and-their-impact-on-hardening-techniques/允许在不同的地址加载(ASLR 和共享库)。这允许你有跳转表section .rodata, or static const int *foo = &bar;没有运行时初始化程序。

So mov rdi, qword msg有效(10 字节的 NASM/YASM 语法mov r64, imm64 http://felixcloutier.com/x86/MOV.html,又名 AT&T 语法movabs,唯一可以使用 64 位立即数的指令)。但它更大并且通常比lea rdi, [rel msg],如果您决定不禁用,则应该使用它-pie。根据 Sandybridge 系列 CPU 的说法,从 uop 缓存中获取 64 位立即数的速度较慢阿格纳·福格的微建筑 pdf http://agner.org/optimize/。 (是的,问这个问题的是同一个人。:)

您可以使用 NASMdefault rel而不是在每个中指定它[rel symbol]寻址模式。也可以看看Mach-O 64 位格式不支持 32 位绝对地址。 NASM 访问阵列 https://stackoverflow.com/questions/47300844/mach-o-64-bit-format-does-not-support-32-bit-absolute-addresses-nasm-accessing有关避免 32 位绝对寻址的更多说明。 OS X 根本无法使用 32 位地址,因此 RIP 相对寻址也是最好的方法。

在位置相关的代码中(-no-pie),你应该使用mov edi, msg当您想要寄存器中的地址时; 5字节mov r32, imm32甚至比 RIP 相关的 LEA 还要小,并且可以运行它的执行端口更多。

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

x86-64 Linux 中不再允许使用 32 位绝对地址? 的相关文章

  • 有没有比使用 backtrace() 更便宜的方法来查找调用堆栈的深度?

    我的日志记录代码使用的返回值回溯 http linux die net man 3 backtrace确定当前堆栈深度 出于漂亮的打印目的 但我可以从分析中看到这是一个相当昂贵的调用 我不认为有更便宜的方法吗 请注意 我不关心帧地址 只关心
  • 如何在 Linux 上调用 Python 中的内联机器代码?

    我正在尝试从 Linux 上的纯 Python 代码调用内联机器代码 为此 我将代码嵌入到字节文字中 code b x55 x89 xe5 x5d xc3 然后打电话mprotect http www kernel org doc man
  • lambda 始终返回“1”

    有这样的代码 include
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 使用openssl从服务器获取证书

    我正在尝试获取远程服务器的证书 然后可以将其添加到我的密钥库中并在我的 Java 应用程序中使用 一位高级开发人员 正在度假 告诉我我可以运行这个 openssl s client connect host host 9999 获取转储的原
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • 远程 ssh 命令:第一个回显输出丢失

    我试图通过 ssh 1 liner 调用在远程机器上运行多个命令 方法是将它们指定为传递给 bash c 的分号分隔字符串 它适用于某些情况 但不适用于其他情况 看一下这个 Note the echo 1 output is lost ba
  • Linux 源代码中的哪个位置会识别特定的 USB 设备?

    我有一个特定的 USB 设备 我想检查其 Linux 驱动程序源代码 我的理解是 USB 驱动程序执行的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备 就我而言 供应商 ID 是0BDA产品 ID 是8187 有了这些信
  • bash 或 sh 中的“=”和“==”运算符有什么区别

    我意识到 和 运算符都可以在 if 语句中使用 例如 var some string if var some string then doing something fi if var some string then doing some
  • 在命令行上解密使用 PHP openssl_encrypt 制作的文件

    我有一个要加密的字符串 encryptThis Super Secret Text echo openssl encrypt encryptThis aes 128 cbc 1234 FALSE F68A9A229A516752 然后我通过
  • 如何更改 Xcode 中的编译器

    我正在 Xcode 4 6 3 中编译 C 代码 但我不知道我正在使用哪个编译器 我需要使用 gcc 4 2 提前致谢 If you really需要更改为 gcc 您可以在构建设置中执行此操作
  • 如何BSWAP 64位寄存器的低32位?

    我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案 例如 0x0123456789abcdef位于 RAX 寄存器内 我想将其更改为0x01234567efcdab89用一条指令 因为性能 所以我尝试了以下内联
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 使用 AVX 内在函数代替 SSE 并不能提高速度 - 为什么?

    我已经使用 Intel 的 SSE 内在函数相当长一段时间了 并取得了良好的性能提升 因此 我希望 AVX 内在函数能够进一步加速我的程序 不幸的是 直到现在情况并非如此 可能我犯了一个愚蠢的错误 所以如果有人能帮助我 我将非常感激 我使用
  • 让“git pull”在拉取不同分支时要求确认

    当同时处理许多项目和分支时 我偶尔会犯一些愚蠢的错误 比如拉入错误的分支 例如在分支上master I did git pull origin dangerous code并且有一段时间没有注意到这一点 这个小错误造成了很大的混乱 当我尝试
  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 用更有意义的文本替换 GCC 输出中的 a-hats [重复]

    这个问题在这里已经有答案了 可能的重复 为什么 gcc 的所有错误消息中都有 https stackoverflow com questions 547071 why does gcc have a in all its error mes
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些

随机推荐

  • 检查 Web 服务中的 Json

    我的 json 有问题 我希望我的 Json 看起来像 data phoneId 1 token APA91bF2tN5g1TtULFE5tysRMAarygjX4w9hjTGCqT3SL PwiMV6aqTtkV3lpqLkc7msVfE
  • Google Sheets 转置具有多个值的数据

    我试图按如下方式显示示例数据 我可以使用数据透视表和多个值来完成此操作 没有任何问题 但希望找到一种使用查询或其他方法的方法 使用下面的公式部分解决了此问题 但不包括 其他 列 Index Transpose Unique Filter B
  • 为什么输出窗口无法显示结果。图像处理-线条检测

    该霍夫变换程序应该在执行时显示源图像 输出图像 带有图像的边缘检测结果窗口 但是 即使源图像和边缘检测结果 输出图像窗口也不会显示任何内容 链接https github com eToTheEcs hough transform blob
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • 如何解决 CruiseControl.NET 中 任务中的“只能指定一个项目”错误

    我正在尝试以相当直接的方式使用 CruiseControl NET 版本 1 3 0 2918 中的任务
  • 更改数据的时区值

    我必须导入不带时区信息的数据在其中 但是 我知道我要导入的数据的具体时区 但我需要timestamp with time zone数据库中的格式 一旦我导入它并将时间戳数据类型设置为timestamp with time zone Post
  • Nancyfx 通过 HTTPS 自托管

    我尝试以自托管模式启动 nancyfx 网络服务器 执行以下代码时一切正常 public static void Main string args var hostConfig new HostConfiguration UrlReserv
  • 如何在 .NET 中操作 VB6 集合?

    我目前正在为 NET 软件设计一个接口 该接口将由 COM 对象 特别是 VB6 使用 虽然我找到了 Microsoft 的许多页面 详细介绍了如何创建 COM 互操作接口 但我目前在设计时对 Collections 的使用感到困惑 我希望
  • ANDROID NDK - android:找不到命令

    我试图完成 Android NDK 中提供的第一个示例练习 我试图在 cygwin 上运行以下命令 android update project p 然而 我得到android command not found error 我检查了我的
  • 套接字是否可以仅针对 recv() 函数设为非阻塞?

    我希望能够打电话recv 不必阻塞 所以我想让它成为非阻塞 但我不希望它在发送数据时是非阻塞的 那么能否将套接字设为非阻塞 recv 函数 或者阻塞 非阻塞模式是否影响所有套接字函数 对于 Windows 您可以使用ioctlsocket
  • 如何验证 SQL Server 流量是否已加密?

    我需要证明我们应用程序连接字符串中的加密设置有效 验证从我们的网站到 SQL Server 的流量是否确实已加密的最简单方法是什么 你可以使用类似的东西Wireshark http www wireshark org 查看通过网络传输的数据
  • 如何搜索包含表情符号的文本?

    我们有一个 MySQL InnoDB 表 带有一个文本字段COLLATE utf8mb4 unicode ci 我需要搜索包含任何表情符号字符的行 我搜索了相当多的问题 但人们似乎有一个他们正在搜索的表情符号列表 我实际上正在寻找一种可以找
  • Powershell调试事件-Action代码块

    我有脚本监视特定目录中的文件创建 我在创建 System IO FileSystemWatcher 后使用 Register ObjectEvent 它工作得很好 但如果我在 Action 代码块中设置断点 IDE 会生成 警告 不会命中
  • 如何修复 titleView 在转换过程中被屏蔽到导航栏的问题?

    在我的视图控制器中我设置titleView to a UIView其中包含一个UIImageView在其图层上使用 setCornerRadius 将其制成圆形 圆圈的上半部分位于导航栏上方 下半部分位于视图上方 如下所示 现在 当我推动此
  • 在 __init__ 中使用属性设置器

    如何在中使用属性设置器 init 没有 pylint 抱怨该属性已在外部定义 init 例如 以下代码仅产生一个异常 该异常被底部的 try 子句捕获 class CircleNotUsingSetterInInit object def
  • 如何在seaborn中记录比例

    我正在使用seaborn 绘制一些生物学数据 我想要一个基因相对于另一个基因的分布 在约 300 名患者中表达 并且以下代码工作正常 graph sns jointplot x Gene1 y Gene2 data data kind re
  • java ee http-basic 身份验证错误页面

    使用 Java EE 中基于表单的身份验证来保护 Web 应用程序 我们可以指定登录和错误 html 页面 http docs oracle com javaee 5 tutorial doc bncbe html http docs or
  • 如何在Python中将字符串转换为复数?

    我正在尝试将输入字符串转换为浮点数 但是当我这样做时 我不断收到某种错误 如下面的示例所示 gt gt gt a 3 3j gt gt gt b complex a Traceback most recent call last File
  • 如何以编程方式创建 Azure AD 用户?

    我知道有一个天蓝色的门户可以管理组 用户等 有什么方法可以以编程方式执行此操作 使用 web api 或 C 中的 sdk 提前致谢 使用 Microsoft Graph REST 可以轻松创建 Azure AD 用户 这是一个代码示例供您
  • x86-64 Linux 中不再允许使用 32 位绝对地址?

    64 位 Linux 默认使用小内存模型 将所有代码和静态数据置于 2GB 地址限制以下 这确保您可以使用 32 位绝对地址 旧版本的 gcc 对静态数组使用 32 位绝对地址 以便节省相对地址计算的额外指令 然而 这不再有效 如果我尝试在