相关疑难解决方法(0)

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

如何关闭gcc编译器优化以启用缓冲区溢出

我正在处理一个需要禁用编译器优化保护才能工作的作业问题.我在ubuntu linux上使用gcc 4.4.1,但无法弄清楚哪些是正确的.我意识到它依赖于架构 - 我的机器运行32位英特尔处理器.

谢谢.

c gcc buffer-overflow compiler-optimization

66
推荐指数
5
解决办法
9万
查看次数

R_X86_64_32S和R_X86_64_64重定位是什么意思?

当我尝试在64位FreeBSD中编译C应用程序时出现以下错误:

在制作共享对象时不能使用重定位R_X86_64_32S; 用-fPIC重新编译

什么是R_X86_64_32S搬迁,什么是R_X86_64_64

我已经用Google搜索了错误,这可能是原因 - 如果有人能说出R_X86_64_32S的真正意义,那就太好了.

c compiler-construction linker elf relocation

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

直接读程序计数器

在内核模式或其他模式下,可以直接读取Intel CPU上的程序计数器(即没有"技巧")吗?

x86 assembly program-counter

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

-fPIC标志可以增加多少开销?

我正在测试一个计算Mandelbrot分形的简单代码.我一直在检查它的性能,具体取决于函数中的迭代次数,它检查一个点是否属于Mandelbrot集.令人惊讶的是,在添加-fPIC旗帜后,我的时间差异很大.从我读到的开销通常可以忽略不计,我遇到的最高开销约为6%.我大约30%.任何建议将被认真考虑!

我的项目详情

我使用-O3标志,gcc 4.7.2,Ubuntu 12.04.2,x86_64.结果如下

    #iter     C (fPIC)  C       C/C(fPIC)
    1         0.01      0.01    1.00 
    100       0.04      0.03    0.75 
    200       0.06      0.04    0.67 
    500       0.15      0.1     0.67 
    1000      0.28      0.19    0.68
    2000      0.56      0.37    0.66 
    4000      1.11      0.72    0.65 
    8000      2.21      1.47    0.67
   16000      4.42      2.88    0.65 
   32000      8.8       5.77    0.66 
   64000      17.6      11.53   0.66

我使用的命令:

gcc -O3 -fPIC fractalMain.c fractal.c -o ffpic
gcc -O3 fractalMain.c fractal.c -o f
Run Code Online (Sandbox Code Playgroud)

代码:fractalMain.c

#include <time.h>
#include <stdio.h>
#include <stdbool.h> …
Run Code Online (Sandbox Code Playgroud)

c performance gcc

27
推荐指数
2
解决办法
6217
查看次数

GCC创建共享对象而不是可执行二进制文件

我有一个正在建设的图书馆.当我运行以下任何一个时,我的所有对象都会连续编译和链接: ar rcs lib/libryftts.a $^

gcc -shared $^ -o lib/libryftts.so

在我的Makefile中.我也能够成功安装它们/usr/local/lib 当我用nm测试文件时,所有的功能都在那里.我的问题是,当我跑步gcc testing/test.c -lryftts -o test && file ./testgcc testing/test.c lib/libryftts.a -o test && file ./test 它说:

test: ELF 64-bit LSB shared object而不是test: ELF 64-bit LSB executable像我期望的那样.我究竟做错了什么?

c gcc shared-libraries static-libraries

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

在现代x86上有哪些方法可以有效地扩展指令长度?

想象一下,您希望将一系列x86汇编指令与某些边界对齐.例如,您可能希望将循环对齐到16或32字节的边界,或者将指令打包以使它们有效地放置在uop缓存中或其他任何位置.

实现这一目标的最简单方法是单字节NOP指令,紧接着是多字节NOP.虽然后者通常效率更高,但这两种方法都不是免费的:NOP使用前端执行资源,并且还计入现代x86上的4宽1重命名限制.

另一个选择是以某种方式延长一些指令以获得所需的对齐.如果这样做没有引入新的停顿,它似乎比NOP方法更好.如何在最近的x86 CPU上有效地延长指令?

在理想的世界中,延长技术同时是:

  • 适用于大多数说明
  • 能够通过可变数量延长指令
  • 不会停止或以其他方式减慢解码器的速度
  • 在uop缓存中有效表示

有一种方法不可能同时满足所有上述要点,因此很好的答案可能会解决各种权衡问题.


1 AMD Ryzen的限制为5或6.

optimization performance x86 assembly micro-optimization

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

x86-64中movq和movabsq之间的区别

我是这里的新手,刚刚开始学习汇编语言.所以,如果我错了,请纠正我,或者如果这篇文章没有任何意义我会删除.

我在讨论x86-64英特尔架构中的数据移动指令.我已经读过,常规movq指令只能有直接的源操作数,可以表示为32位二进制补码数,而movabsq指令可以有任意64位立即数作为其源操作数,并且只能有一个寄存器作为目标.

你能详细说明一下吗?这是否意味着我只能使用movabsq指令移动64位立即值?只有立即价值到登记册?我不知道如何将64位立即值移动到内存中.或者也许我错了一些重要的事情.

x86 assembly x86-64 instruction-set att

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

为什么Linux/gnu链接器选择地址0x400000?

我在Linux x86_64上试验ELF可执行文件和gnu工具链:

我已经链接并剥离(手工)"Hello World"测试.:

        .global _start
        .text
_start:
        mov     $1, %rax
        ...
Run Code Online (Sandbox Code Playgroud)

到一个267字节的ELF64可执行文件...

0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 3e00 0100 0000 d400 4000 0000 0000  ..>.......@.....
0000020: 4000 0000 0000 0000 0000 0000 0000 0000  @...............
0000030: 0000 0000 4000 3800 0100 4000 0000 0000  ....@.8...@.....
0000040: 0100 0000 0500 0000 0000 0000 0000 0000  ................
0000050: 0000 4000 0000 0000 0000 4000 0000 0000  ..@.......@.....
0000060: 0b01 0000 0000 0000 0b01 0000 …
Run Code Online (Sandbox Code Playgroud)

linux x86 x86-64 elf ld

16
推荐指数
2
解决办法
3347
查看次数

如何在NASM中使用scanf?

我正在试图弄清楚如何使用scanf来获取用户输入.我知道要使用printf:我所要做的就是将我想要在屏幕上写入的数据推送到堆栈中,如下所示:

global _main
extern _printf
extern _scanf

section .data
msg db "Hi", 0

section .text
_main:
  push ebp
  mov ebp, esp  

  push msg
  call _printf

  mov esp, ebp
  pop ebp
ret
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何使用scanf.有人可以给我一个最简单的源代码scanf吗?我真的只想把用户输入的内容放入其中.

我不习惯32位大会.我只使用16位,我知道在16位(DOS)你可以这样做:

mov ah, 3fh
mov dx, input
int 21h

input rb 100d
Run Code Online (Sandbox Code Playgroud)

无论你键入什么,都会放在"输入"的地址.

assembly nasm

14
推荐指数
2
解决办法
3万
查看次数