小编Win*_*ser的帖子

为什么x86-64的jmpq只需要32位长度的地址?

当我objdump -D用来反汇编二进制时,典型的代码jmpq就像e9 7f fe ff ff是,用于表示负偏移.但是,x86-64的地址是64(48)位(据我所知),那么这个32位地址如何7f fe ff ff表示64位绝对地址的负偏移?

此外,还有像任何其他指令jmpjmpq,但有64位地址位移?我怎样才能找到英特尔或AMD手册中的说明(我搜索jmpq但没有找到任何内容)?


当我搜索时,它似乎被称为RIP相对寻址.似乎并非所有说明都这样做.是否有64位相对寻址?如果是间接跳转,64位绝对地址将在寄存器或内存中,对吧?

assembly x86-64 computer-architecture

11
推荐指数
2
解决办法
3954
查看次数

当一个进程分叉时,共享库.so还会在地址空间吗?并且构造函数会再次执行吗?

当进程分叉时,子进程是否会在其地址空间中具有自定义共享库(.so文件)?

如果是这样,共享库的地址是否与其父进程相同或不同(由于ASLR)?

__attribute__ ((constructor)) constructor在所有子进程中,在main函数之前运行的函数是否会再次执行?线程怎么样?

c linux multithreading fork process

6
推荐指数
1
解决办法
1534
查看次数

使用setjmp和longjmp时,jmp_buf中的实际内容是什么?

setjmp()应该将包含"返回地址"和"堆栈指针"的寄存器保存到"jmp_buf"中.当我编译(gcc和clang)并使用glibc在x86_64下调试以下程序时,我无法理解"jmp_buf"中的内容以及"返回地址"和"堆栈指针"位于"jmp_buf"中的位置.

#include <stdio.h>
#include <setjmp.h>

int main()
{
    int i;

    jmp_buf env;

    i = setjmp(env);

    printf("i = %d\n", i);

    if (i != 0) return;

    longjmp(env, 2);
    printf("Does this line get printed?\n");
}   
Run Code Online (Sandbox Code Playgroud)

当程序在"printf("i =%d \n",i);"之前的断点处停止时,我尝试了gdb功能:"p/x env"; 但是我在这个包含__jmpbuf和__saved_mask的结构(env)中找不到"返回RIP"和"之前的RSP".任何人都知道这两个函数究竟是如何工作的以及它们在x86_64下用glibc保存的是什么(我使用的是ubuntu 14.04)?

c debugging gdb longjmp setjmp

5
推荐指数
1
解决办法
1743
查看次数

如何使用BPF过滤内核函数参数?

如何使用Berkeley Packet Filter(BPF)过滤内核中的函数参数?该函数应该是任何非内联函数,而不仅仅是系统调用.此外,最好能够取消引用函数参数中的指针以进行验证.

我搜索了互联网,但找不到任何用例.大多数材料仅描述了如何使用seccomp/seccomp-BPF.

似乎整合了eBPF和kprobe/jprobe来实现挂钩.但我无法在网上找到一个好的例子.

chroot sandbox linux-kernel seccomp bpf

5
推荐指数
1
解决办法
624
查看次数

区分数据与ARM中的指令

在(32 位)ARM Linux 内核中,如何区分代码部分中嵌入的数据和指令?

最好有一个轻量级的方法,比如位掩码,它可以很容易地实现。将反汇编程序嵌入内核是不明智的。

architecture arm instruction-set disassembly

2
推荐指数
1
解决办法
381
查看次数

如何使用Linux内核模块中的地址转储/列出所有内核符号?

在内核模块中,如何列出所有内核符号及其地址?不应重新编译内核。

我知道接口中的“ cat / proc / kallsyms”,但是如何使用诸如之类的函数直接从内核数据结构中获取它们kallsyms_lookup_name

kernel-module linux-kernel

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