Articles of x86 64

过程连接表和全局抵销表

我正在读PLT(过程连接表)和GOT(全局抵消表)这篇文章 。 虽然PLT的目的很清楚,但我仍然对GOT感到困惑。 我从文章中了解到,只有在共享库中声明为externvariables才需要GOT。 对于在共享库代码中声明为static全局variables,这不是必需的。 我的理解是正确的,还是我完全忽略了这一点。

用AT&T语法打印一个整数作为string,用Linux系统调用代替printf

我写了一个汇编程序来显示AT&T语法后的一个数字的阶乘。但它不工作。我的代码 .text .globl _start _start: movq $5,%rcx movq $5,%rax Repeat: #function to calculate factorial decq %rcx cmp $0,%rcx je print imul %rcx,%rax cmp $1,%rcx jne Repeat # Now result of factorial stored in rax print: xorq %rsi, %rsi # function to print integer result digit by digit by pushing in #stack loop: movq $0, %rdx […]

如何将Linux 32位gcc内联汇编转换为64位代码?

我试图在Linux中使用gcc将RR0D Rasta Ring 0 Debugger从32位模式转换为64位模式(长模式)。 我熟悉x86 32位程序集(在MS-DOS环境下),但我是x86 64位程序集和Linux汇编程序devise的初学者。 此项目是为生产使用(我需要一个工作的非源代码debugging器),但我也试图学习如何做32位到64位转换。 如果可能的话,我试图find一种通用的方法来进行32位到64位的转换,这些转换可以在任何使用正则expression式的32位程序上完成(这样可以自动化)。 我知道没有一个通用的解决scheme(64位代码可能比32位代码占用更多的空间,并消耗更多的堆栈等),但即使在这种情况下,自动转换的代码将作为一个起点。 这个想法是保持8位和16位操作数,并用64位操作数replace32位操作数。 这种方法自然会失败,如果pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx被pushw %ax; pushw %bx; popq %rcxreplacepushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx ,但行为良好的程序通常不会push两个16位操作数,然后pop一个32位操作数,或者他们? 到目前为止,这些转换是: 编辑:修正: […]

我可以在Windows上加载一个32位DLL到64位进程吗?

我最近升级了ac#windows服务作为64位.net进程运行。 通常情况下,这将是微不足道的,但系统使用C ++编写的32位DLL。 这不是一个select将此DLL转换为64位,所以我将DLL包装在一个单独的32位.net进程,并通过远程处理暴露.net接口。 这是一个相当可靠的解决scheme,但是我宁愿将系统作为单个进程运行。 有什么办法可以加载我的32位DLL到64位进程,并直接访问它(也许通过某种thunking层)?

Linux AMD64中使用的fs / gs寄存器如何?

在x86-64架构上,两个寄存器有一个特殊用途:FS和GS。 在linux 2.6。*中,FS寄存器似乎被用来存储线程本地信息。 那是对的吗? 什么是存储在FS:0? 有没有描述这个内容的C结构? 什么是GS的使用?

是什么导致页面错误?

根据维基百科 : 页面错误是当程序访问虚拟地址空间中映射的页面但不加载到物理内存中时硬件引发的软件陷阱。 (重点是我的) 好的,这是有道理的。 但是,如果是这样的话,为什么每当Process Hacker中的进程信息被刷新时,我就看到大约15页错误? 或换句话说,为什么有任何记忆被分页? (我不知道它是用户还是内核内存。)我没有页面文件,内存使用量是4 GB中的1.2 GB,这是干净的重新启动之后。 没有任何资源短缺, 为什么会有东西被分页?

什么是x86_64 va_list结构的格式?

任何人都可以参考x86_64 ABI(在Linux上使用的)中的va_list的表示? 我试图debugging一些代码堆栈或参数似乎损坏,这将有助于了解我应该看到什么…

在Windows 64位上将mod_wsgi模块加载到apache的问题

我试图按照这个指令安装mod_wsgi模块。 我已经从这个源下载了mod_wsgi.so。 看起来像apache无法正确地重新启动服务,并且在将以下行添加到httpd.conf后无法加载该页面 LoadModule wsgi_module modules/mod_wsgi.so 我已经从一些来源检查了一些问题,如下所示: 文件名是正确的 – mod_wsgi.so不是mod_wsgi.so.so 该文件的权限设置为与正确加载的其他模块相同 Python为所有用户安装 环境: WindowsServer®Standard FE 64位 WAMP 2.0上的Apache 2.2.8 Python 2.7.1为所有用户安装 不加载这个模块,Apache运行正常。 我的问题是什么? 应用程序error.log: [Mon May 23 10:12:20 2011] [notice] Parent: Received shutdown signal — Shutting down the server. [Mon May 23 10:12:20 2011] [notice] Child 4528: Exit event signaled. Child process is ending. [Mon […]

FillChar和StringOfChar在Delphi 10.2下用于Win64发布目标

我有一个关于Delphi 10.2 Pascal编程语言中的特定编程问题的问题。 在2012年以前发布的CPU上的Win64 Release版本中,StringOfChar和FillChar无法正常工作。 FillChar的预期结果只是在给定的内存缓冲区中重复8位字符的普通序列。 StringOfChar的预期结果是相同的,但结果存储在一个stringtypes中。 但实际上,当我编译10.2以前版本的Delphi中使用Delphi的应用程序时,为Win64编译的应用程序在2012年以前发布的CPU上停止正常工作。 StringOfChar和FillChar不能正常工作 – 它们返回不同字符的string,尽pipe是重复模式 – 不仅仅是它们应该具有的相同字符序列。 这是最小的代码足以certificate这个问题。 请注意,序列的长度至less应为16个字符,字符不能为0(#0)。 代码如下: procedure TestStringOfChar; var a: AnsiString; ac: AnsiChar; begin ac := #1; a := StringOfChar(ac, 43); if a <> #1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1 then begin raise Exception.Create('ANSI StringOfChar Failed!!'); end; end; 我知道在StackOverflow中有很多Delphi程序员。 你遇到同样的问题吗? 如果是的话,你如何解决? 解决办法是什么? 顺便说一句, 我已经联系了Delphi的开发者,但是他们并没有确认也没有否认这个问题 。 我正在使用Embarcadero Delphi 10.2版本25.0.26309.314。 更新: 如果您的CPU是在2012或更高版本中生产的,则在调用StringOfChar重现此问题之前,还需要包含以下行: […]

64位应用程序与32位进程通信

我有32位应用程序使用32位的第三方库。 现在我必须使我的应用程序64位,以便它可以利用64位地址空间(大内存)。 由于我无法将32位库加载到64位应用程序进程中,因此我正在考虑使用IPC(命名pipe道/套接字)从我的64位应用程序通过第三方库创build32位可执行封装程序。 所以我的问题是他们这样做的问题吗? 另外,如果我必须在64位系统上安装我的应用程序,与我的应用程序相关的所有文件将被复制到“c:\ Program Files”目录。 现在我可以保持我的32位第三方EXE包装在相同的“C:\ Program Files”或我需要复制到“C:\ Program Files文件(x86)”目录?