相关疑难解决方法(0)

70
推荐指数
2
解决办法
6万
查看次数

有没有办法让gcc输出原始二进制文件?

是否有一组命令行选项可以说服gcc从自包含的源文件生成平面二进制文件?例如,假设foo.c的内容是

static int f(int x)
{
  int y = x*x;
  return y+2;
}
Run Code Online (Sandbox Code Playgroud)

没有外部引用,没有什么可以导出到链接器.我想获得一个只包含此功能的机器说明的小文件,没有任何其他装饰.类似于(DOS).COM文件,除了32位保护模式.

linux x86 linker command-line gcc

29
推荐指数
4
解决办法
3万
查看次数

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

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位绝对地址?

linux gcc x86-64 linker-errors relocation

21
推荐指数
1
解决办法
5787
查看次数

在64位x86平台上比较PIE,PIC代码和可执行文件有什么区别?

测试是在Ubuntu 12.04 64位上进行的.x86架构.

我对位置独立可执行(PIE)和位置无关代码(PIC)的概念感到困惑,我猜它们不是正交的.

这是我的快速实验.

gcc -fPIC -pie quickSort.c -o a_pie.out
gcc -fPIC      quickSort.c -o a_pic.out
gcc                           a.out

objdump -Dr -j .text a.out > a1.temp
objdump -Dr -j .text a_pic.out > a2.temp
objdump -Dr -j .text a_pie.out > a3.temp
Run Code Online (Sandbox Code Playgroud)

我有以下发现.

A. a.out包含一些PIC代码,但在libc序言和结尾函数中有效,如下所示:

4004d0:       48 83 3d 70 09 20 00    cmpq   $0x0,0x200970(%rip)        # 600e48 <__JCR_END__> 
Run Code Online (Sandbox Code Playgroud)

在我的简单快速排序程序的汇编指令中,我没有找到任何PIC指令.

B. a_pic.out包含PIC代码,我没有找到任何非PIC指令...在我的快速排序程序的指令中,所有全局数据都由PIC指令访问,如下所示:

  40053b:       48 8d 05 ea 02 00 00    lea    0x2ea(%rip),%rax        # 40082c <_IO_stdin_used+0x4>
Run Code Online (Sandbox Code Playgroud)

C. a_pie.out包含与a_pic.out比较的语法相同的指令.但是,a_pie.out的.text段的内存地址范围为0x630到0xa57,而a_pic.out的相同部分的范围是0x400410到0x400817.

谁能给我一些关于这些现象的解释?特别是发现 …

c linux x86 assembly elf

15
推荐指数
1
解决办法
5517
查看次数

如何获取c代码来执行十六进制字节码?

我想要一个简单的C方法,以便能够在Linux 64位机器上运行十六进制字节码.这是我的C程序:

char code[] = "\x48\x31\xc0";
#include <stdio.h>
int main(int argc, char **argv)
{
        int (*func) ();
        func = (int (*)()) code;
        (int)(*func)();
        printf("%s\n","DONE");
}
Run Code Online (Sandbox Code Playgroud)

我试图运行的代码("\x48\x31\xc0")我通过编写这个简单的汇编程序获得(它不应该真的做任何事情)

.text
.globl _start
_start:
        xorq %rax, %rax
Run Code Online (Sandbox Code Playgroud)

然后编译并objdump它以获取字节码.

但是,当我运行我的C程序时,我得到了一个分段错误.有任何想法吗?

c x86 assembly x86-64 shellcode

9
推荐指数
4
解决办法
1万
查看次数

Linux ldd 中的“静态链接”和“非动态可执行文件”有什么区别?

考虑这个 AMD64 汇编程序:

.globl _start
_start:
    xorl %edi, %edi
    movl $60, %eax
    syscall
Run Code Online (Sandbox Code Playgroud)

如果我编译gcc -nostdlib并运行ldd a.out,我得到这个:

        statically linked
Run Code Online (Sandbox Code Playgroud)

如果我改为使用gcc -static -nostdlib并运行编译它ldd a.out,我会得到这个:

        not a dynamic executable
Run Code Online (Sandbox Code Playgroud)

什么之间的区别statically linkednot a dynamic executable?如果我的二进制文件已经静态链接,为什么添加-static会影响任何事情?

linux gcc x86-64 static-linking ldd

8
推荐指数
1
解决办法
1812
查看次数