小编lll*_*lll的帖子

为什么GCC编译C程序需要.eh_frame部分?

测试在32位x86 Linux和gcc4.6.3上进行

gcc用于编译C程序并使用readelf检查部分信息时,我可以看到里面的.eh_frame部分和.eh_frame_hdr部分.

例如,这是二进制程序的部分信息Perlbench.

readelf -S perlbench

There are 28 section headers, starting at offset 0x102e48:

Section Headers:
[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 0]                   NULL            00000000 000000 000000 00      0   0  0
[ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1
[ 2] .note.ABI-tag     NOTE            08048168 000168 000020 00   A  0   0  4
[ 3] .note.gnu.build-i …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly exception-handling elf

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

如何"转到"c中的不同功能?

基本上我试图在C中模拟汇编代码.

这是C代码:

int main()
{
   test();
main_next:
   printf("Hello, World!");
}

void test()
{
     goto main_next;
}
Run Code Online (Sandbox Code Playgroud)

尝试编译此代码(Linux 32位,gcc 4.6.3),我收到此错误:

 error: label ‘main_randomtag_next’ used but not defined
Run Code Online (Sandbox Code Playgroud)

有谁知道如何在C中进行这种程序间的转换?

谢谢!

c assembly calling-convention

23
推荐指数
2
解决办法
6976
查看次数

如何从Linux上的c源代码生成一个nasm可编译的汇编代码?

测试平台是32位Linux.

基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.

我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......

所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?

assembly gnu-assembler nasm tasm yasm

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

在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
查看次数

长片优化深度Q网络

我正在研究一个旨在通过深度Q学习解决的问题。但是,问题在于,每个情节的培训时间都太长,大约需要83个小时。我们正在设想在100集之内解决问题。

因此,我们逐渐学习矩阵(100 * 10),并且在每个情节中,我们需要执行某些操作的100 * 10迭代。基本上,我们从1000个候选者的集合中选择一个候选者,将该候选者放入矩阵中,然后通过将整个矩阵作为输入来计算奖励函数:

在此处输入图片说明

中心的障碍是,每一步的奖励函数计算都非常昂贵,大约需要2分钟,并且每次我们更新矩阵中的一个条目时。

从长远来看,矩阵中的所有元素都是相互依赖的,因此,如果我理解正确的话,整个过程似乎不适合某些“分布式”系统。

有人可以阐明我们如何看待这里的潜在优化机会吗?喜欢一些额外的工程工作吗?任何建议和评论将不胜感激。谢谢。

========================更新了一些定义=================

0.初始阶段:

  • 100 * 10矩阵,每个元素为空

1.动作空间:

  • 每一步,我将从1000个元素的候选池中选择一个元素。然后将元素一一插入矩阵。

2.环境:

  • 每一步我都会有一个更新的矩阵来学习。

  • oracle函数F返回的定量值范围为5000〜30000,值越高越好(F的一次计算大约需要120秒)。

    此函数F将矩阵作为输入并执行非常昂贵的计算,并且返回一个定量值以指示到目前为止合成矩阵的质量。

    此函数本质上用于衡量系统的某些性能,因此确实需要一些时间才能在每个步骤中计算奖励值。

3.情节:

说“我们正在计划在100集内解决它”,这只是一个经验估计。但至少不应少于100集。

4.约束

理想的是,就像我提到的那样,“矩阵中的所有元素长期相互依赖”,这就是为什么奖励函数F通过将整个矩阵作为输入而不是最新选择的元素来计算奖励。

实际上,通过在矩阵中添加越来越多的元素,奖励可以增加,也可以减少。

5.目标

合成矩阵应使oracle函数F返回大于25000的值。只要达到此目标,我都会终止学习步骤。

optimization machine-learning reinforcement-learning deep-learning

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

x86 bsr/bsf如何具有固定的延迟,而不是数据依赖?它不像伪代码那样循环比特吗?

我正在试图分析一些x86二进制代码的"时序通道".我发布了一个问题来理解bsf/bsr操作码.

如此高级,这两个操作码可以被建模为"循环",它计算给定操作数的前导零和尾随零.该x86手册对这些操作码具有良好的形式化,如下所示:

IF SRC = 0
  THEN
    ZF ? 1;
    DEST is undefined;
  ELSE
    ZF ? 0;
    temp ? OperandSize – 1;
    WHILE Bit(SRC, temp) = 0
    DO
      temp ? temp - 1;
    OD;
    DEST ? temp;
FI;
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,bsf/bsr指令似乎有固定的cpu周期.根据我在这里找到的一些文档:https://gmplib.org/~tege/x86-timing.pdf,似乎它们总是需要8个CPU周期来完成.

所以这是我的问题:

  1. 我确认这些指令有固定的cpu周期.换句话说,无论给出什么操作数,它们总是花费相同的时间来处理,并且没有"时序通道".我在英特尔的官方文档中找不到相应的规格.

  2. 那么为什么有可能呢?显然这是一个"循环"或某种程度,至少是高级别的.背后的设计决策是什么?CPU流水线更容易?

performance x86 assembly intel cpu-architecture

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

OCaml是否像Python一样有String.split函数?

我用它来分割字符串:

 let split = Str.split (Str.regexp_string " ") in
   let tokens = split instr in
 ....
Run Code Online (Sandbox Code Playgroud)

但问题是,例如这里是我要解析的句子:

pop     esi
Run Code Online (Sandbox Code Playgroud)

并且在拆分之后它变成了(我使用辅助函数来打印tokens列表中的每个项目):

item: popitem: item: item: item: esi
Run Code Online (Sandbox Code Playgroud)

请注意,令牌列表中有三个空格.

我想知道string.splitPython中是否有类似可以解析的instr方式:

item: popitem: esi
Run Code Online (Sandbox Code Playgroud)

可能吗?

ocaml split string-parsing

7
推荐指数
3
解决办法
8973
查看次数

为什么x86架构使用两个堆栈寄存器(esp; ebp)?

我的问题很简单,为什么x86架构使用两个堆栈寄存器(esp ; ebp)?

堆栈帧的长度已在编译期间确定,然后我认为我们可以只使用一个寄存器(例如esp)来访问堆栈,并维护以前在ebp堆栈中(或在其他内存中的寄存器中)的基址地区,但这将导致更多的性能损失)

可能吗?

x86 assembly x86-64

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

这个Haskell代码中的"id"是什么意思?

这个问题来自Haskell新手.

我在下面编写代码来检查True列表中的even数量,如果它有数量True,则返回True,否则返回"False".

xor =
foldr xor' False
where
xor' True True = False
xor' False False = False
xor' _ _ = True
Run Code Online (Sandbox Code Playgroud)

但是,我在下面找到了一些代码片段,似乎它可以做同样的事情.这是代码:

xor :: [Bool] -> Bool
xor = odd . length . filter id 
Run Code Online (Sandbox Code Playgroud)

但是我不知道id上面的代码是如何工作的,有人能给我一些帮助吗?

haskell

7
推荐指数
2
解决办法
1159
查看次数

Z3 Optimize 最大和最小功能背后的理论是什么?

我写信是为了询问 Z3 Optimize 功能背后的理论/算法,特别是它的maximumminimum功能。这对我来说似乎很神奇。它是某种二分搜索吗?它如何有效地计算出这里的最大/最小值..?

我试图搜索相关函数(例如,函数execute_min_max)的源代码,但是如果没有深入理解那里的术语,它对我来说没有太大意义......基本上lex这里代表什么?似乎解决方案以某种方式保存在堆栈内。

任何建议或建议将非常感激。谢谢。

smt z3

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