.data我正在尝试使用 GAS 语法创建一个汇编程序,该程序可以在 x86-64 arch 上以位置无关的方式访问其变量,并强制执行32 位arch 和 IS (%eip而不是%rip)。
无论我尝试什么寄存器,我得到的最好结果都是a Segmentation fault: 11,即使这是为了访问EIP,我根本不应该这样做,因此是SF。最好的结果,因为这至少告诉我一些东西,而不是“嗯,这不行”。
gcc我正在macOS 10.13.6 mid 2010 Intel Core 2 Duo 上编译该文件(这clang可能就是原因):
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Run Code Online (Sandbox Code Playgroud)
并将一些选项传递给链接器:
gcc -m32 -Wl,-fatal_warnings,-arch_errors_fatal,-warn_commons,-pie test.s
Run Code Online (Sandbox Code Playgroud)
ld:警告:PIE 已禁用。绝对寻址(可能是 -mdynamic-no-pic)在代码签名的 PIE 中不允许,但在 /whatever.../test-a07cf9.o 的 _main 中使用。要修复此警告,请勿使用 -mdynamic-no-pic 进行编译或使用 -Wl,-no_pie ld: fatal warning(s)induced error (-fatal_warnings) clang: error: linker command failed …