首页 > TAG信息列表 > x86-64

python-在OSX 10.14.5上安装clickhouse-cityhash时缺少指令’_mm_crc32_u64′

我试图在OSX 10.14.5上使用pip安装clickhouse-cityhash,但它失败,并显示以下(摘要)输出: src/city.cc:396:5: error: use of undeclared identifier '_mm_crc32_u64' CHUNK(1, 1); CHUNK(k0, 0); ^ ... fatal error: too many errors emitted, stopping now [-ferror-limit

x86_64 Linux 3.0:无效的内存地址

x86_64体系结构上的Linux 3.0上的进程具有64位虚拟地址空间. 很明显,在该地址空间中,保证0是无效的内存地址[请参见下面的定义],因为该地址用于指示NULL指针. 保证哪些其他64位数字(如果有)永远都不是有效的内存地址,为什么? 例如,1可以是有效地址吗?那2 ^ 64-1呢? 定义:您是什么意思“

在内核之间共享数据的最有效方法

在多个内核之间共享数据的最有效方法是什么.当然,您可以使用共享内存,但这也要付出一定的代价.假设一个内核正在不断地写入变量,而另一个内核则必须不断地从该变量读取数据.使用MESI缓存一致性协议,写入核心将不时使读取核心使其缓存无效.因此,在这种情况下,什么是共享数据的最有效

ranlib和静态库

我试图链接我创建的静态库,但出现此错误. libmine.a: could not read symbols: Archive has no index; run ranlib to add one 我尝试执行ranlib libmine.a,但未做任何更改,它仍然给出相同的错误.我怎么解决这个问题?解决方法:要查看存档中的符号,请使用nm. nm -s libmine.a <输

linux-通过ASM代码处理syscall

我正在用此代码块替换/挂钩__NR_read sysall(该代码块已编译并作为操作码保存在内核模块的可执行内存中) push rbp; mov rbp, rsp; sub rsp, 64; //8 bytes for rax content + 48 bytes for 6 args + 8 bytes for syscall result mov [rsp], rax; mov [rsp - 8], rdi; mov [rsp -

c-开启ASLR后,图像的所有部分是否每次都相对于图像基址以相同的偏移量加载吗?

每次都以相对于libc基址的相同偏移量加载libc的不同部分(例如.text,.plt,.got,.bss,.rodata等)吗? 我知道每次我运行程序时,加载程序都会在一个随机位置加载libc. 先感谢您.解决方法:我想我找到了自己问题的答案.我使用英特尔PIN编写了一个引脚工具,该引脚工具在每个要加载的libc节

为何使用syscall clobber rcx?

这个问题已经在这里有了答案:            >            Why do x86-64 Linux system calls modify RCX, and what does the value mean?                                    1个 在书Low-Level Programming: C, Assem

可执行代码的高性能malloc实现

我正在动态生成大量的可执行机器代码小片段,所有这些片段的大小和生存期都无法预测.目前,我正在使用一个天真的可执行文件mmap预分配区域,但是由于最终的内存耗尽,这只是临时的.我没有实现任何内存回收机制,而且我也不想这样做:这是一个很难解决的问题(难以调试错误,碎片,多线程等).

这种方法好吗?

对于某些功能,我需要切换堆栈,以使原始堆栈保持不变.为此,我编写了两个宏,如下所示. #define SAVE_STACK() __asm__ __volatile__ ( "mov %%rsp, %0; mov %1, %%rsp" : \ "=m" (saved_sp) : "m" (temp_sp) ); #define RESTORE_STACK() __asm__ __volatile__ ( "mov %0, %%

内核如何知道物理页面由两个不同的进程共享?

我们知道页面表用于从虚拟内存页面地址获取物理内存页面地址.但是,内核如何知道物理内存页是否由不同的进程共享(例如在分叉进程及其父进程的情况下).这样的清单保存在哪里?解决方法:内核是创建所有虚拟映射的实体.因此,它确切地知道什么是共享的,什么不是共享的.没有内核的帮助,用

计算克隆函数的变量参数数量

我正在尝试LD_PRELOAD linux的克隆功能.在我的LD_PRELOADed版本中,需要在调用原始克隆函数之前记录输入参数.但是,问题是克隆使用可变数量的参数.这样声明. int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ... /* pid_t *pid, struct user_desc *tls, pi

如何在Ubuntu x64中使用ptrace插入int3?

我试图按照this guide设置断点来获得相同的结果,唯一的区别是我在x64系统上.因此,我有以下代码用于“ Hello,World!”: ; The _start symbol must be declared for the linker (ld) global _start section .text _start: ; Prepare arguments for the sys_write system cal

c-我可以让共享库构造函数在重定位之前执行吗?

背景:我正在尝试实现系统like that described in this previous answer.总之,我有一个链接到共享库的应用程序(当前在Linux上).我希望该共享库在运行时在多个实现之间切换(例如,基于主机CPU是否支持某个指令集). 在最简单的情况下,我具有三个不同的共享库文件: > libtest.so:这是库的

linux-位置独立代码中的Access .data部分

我正在与NASM建立共享库.在该库中的某些函数中,我需要在C中称为静态变量的东西.基本上,我认为它在.data节中有一些空间: SECTION .data last_tok: dq 0 ; Define a QWORD 当我尝试在函数中访问last_tok时,就会出现问题. 我读了NASM Manual: 8.2 Writing Linux/ELF Share

linux-可以更改发生哪个核心计时器中断的情况吗?

在我的Debian 8系统上,当我运行命令watch -n0.1 –no-title cat / proc / interrupts时,得到以下输出. CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7

为什么从x86_64汇编函数调用C abort()函数会导致分段错误(SIGSEGV)而不是中止信号?

考虑该程序: main.c #include <stdlib.h> void my_asm_func(void); __asm__( ".global my_asm_func;" "my_asm_func:;" "call abort;" "ret;" ); int main(int argc, char **argv) { if (argv[1][0] == 

linux-使用“ push”或“ sub” x86指令时如何分配堆栈内存?

我浏览了一段时间,试图例如在执行操作时了解如何将内存分配给堆栈: push rax 或者移动堆栈指针为子例程的局部变量分配空间: sub rsp, X ;Move stack pointer down by X bytes 我了解的是堆栈段在虚拟内存空间中是匿名的,即不是文件支持的. 我还了解的是,内核不会真正将匿名

linux-sys_brk的资格要求是什么

我正在使用sys_brk syscall在堆中动态分配内存.我注意到在获取当前的休息位置时,我通常会获得类似于以下内容的值: mov rax, 0x0C mov rdi, 0x00 syscall 结果是 rax 0x401000 该值通常对齐512个字节.因此,我想问一下中断值是否有对齐要求?还是我们可以按照自己的方式调整它的

为什么这个movq指令适用于linux而不是osx?

以下汇编代码在OSX 10.9.4上运行时出错,但在Linux上运行成功(Debian 7.6).特别是,movq指令似乎不喜欢label参数. $cat test.S .globl _main _main: movq $_main, %rax ret 这是错误: $as -o test.o test.S test.S:3:32-bit absolute addressing is not supported for x8

c – 可以使用SIMD优化两个字符串之间的字节匹配计数吗?

分析表明这个函数对我的应用来说是一个真正的瓶颈: static inline int countEqualChars(const char* string1, const char* string2, int size) { int r = 0; for (int j = 0; j < size; ++j) { if (string1[j] == string2[j]) { ++r; } }

C和汇编中的对数

显然,MSVC 2017工具集v141(x64版本配置)不通过C/C++内部使用FYL2X x86_64汇编指令,而是使用C log()或log2()用法实现对长函数的实际调用,这似乎实现了近似对数(不使用FYL2X).我测量的性能也很奇怪:log()(自然对数)比log2()(基数2对数)快1.7667倍,即使处理器的基数2对数应该更容易,因

linux – 为什么RCX不用于将参数传递给系统调用,而是用R10替换?

参见英文答案 > Linux x64: why does r10 come before r8 and r9 in syscalls?                                    2个根据System V X86-64 ABI,应用程序中的函数调用使用以下寄存器序列来传递整数参数: rdi, rsi, rdx, rcx, r8, r9 但是系

c – 运行时常量值的重复整数除法

在我的程序中的某个时刻,我计算整数除数d.从那时起,d将是不变的. 稍后在代码中,我将多次除以该d – 执行整数除法,因为d的值不是编译时已知的常量. 鉴于与其他类型的整数运算相比,整数除法是一个相对较慢的过程,我想优化它.我可以存储一些替代格式,以便分割过程执行得更快吗?也许是

c – 为什么std :: optional的构造比std :: pair更昂贵?

考虑这两种可以表示“可选int”的方法: using std_optional_int = std::optional<int>; using my_optional_int = std::pair<int, bool>; 鉴于这两个功能…… auto get_std_optional_int() -> std_optional_int { return {42}; } auto get_my_optional() -> my_optional_in

linux – 为什么这段代码会因地址随机化而崩溃?

我正在学习amd64汇编程序,并试图实现一个简单的Unix过滤器.由于未知原因,即使简化为最低版本(下面的代码),它也会随机崩溃. 我试图在GNU Debugger(gdb)中调试这个程序.在gdb的默认配置中,程序运行正常,但如果我启用地址随机化(设置禁用 – 随机化关闭),程序将开始崩溃(SIGSEGV).有