测试在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中模拟汇编代码.
这是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中进行这种程序间的转换?
谢谢!
测试平台是32位Linux.
基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.
我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......
所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?
测试是在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.
谁能给我一些关于这些现象的解释?特别是发现 …
我正在研究一个旨在通过深度Q学习解决的问题。但是,问题在于,每个情节的培训时间都太长,大约需要83个小时。我们正在设想在100集之内解决问题。
因此,我们逐渐学习矩阵(100 * 10),并且在每个情节中,我们需要执行某些操作的100 * 10迭代。基本上,我们从1000个候选者的集合中选择一个候选者,将该候选者放入矩阵中,然后通过将整个矩阵作为输入来计算奖励函数:
中心的障碍是,每一步的奖励函数计算都非常昂贵,大约需要2分钟,并且每次我们更新矩阵中的一个条目时。
从长远来看,矩阵中的所有元素都是相互依赖的,因此,如果我理解正确的话,整个过程似乎不适合某些“分布式”系统。
有人可以阐明我们如何看待这里的潜在优化机会吗?喜欢一些额外的工程工作吗?任何建议和评论将不胜感激。谢谢。
========================更新了一些定义=================
0.初始阶段:
1.动作空间:
2.环境:
每一步我都会有一个更新的矩阵来学习。
oracle函数F返回的定量值范围为5000〜30000,值越高越好(F的一次计算大约需要120秒)。
此函数F将矩阵作为输入并执行非常昂贵的计算,并且返回一个定量值以指示到目前为止合成矩阵的质量。
此函数本质上用于衡量系统的某些性能,因此确实需要一些时间才能在每个步骤中计算奖励值。
3.情节:
说“我们正在计划在100集内解决它”,这只是一个经验估计。但至少不应少于100集。
4.约束
理想的是,就像我提到的那样,“矩阵中的所有元素长期相互依赖”,这就是为什么奖励函数F通过将整个矩阵作为输入而不是最新选择的元素来计算奖励。
实际上,通过在矩阵中添加越来越多的元素,奖励可以增加,也可以减少。
5.目标
合成矩阵应使oracle函数F返回大于25000的值。只要达到此目标,我都会终止学习步骤。
optimization machine-learning reinforcement-learning deep-learning
我正在试图分析一些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周期来完成.
所以这是我的问题:
我确认这些指令有固定的cpu周期.换句话说,无论给出什么操作数,它们总是花费相同的时间来处理,并且没有"时序通道".我在英特尔的官方文档中找不到相应的规格.
那么为什么有可能呢?显然这是一个"循环"或某种程度,至少是高级别的.背后的设计决策是什么?CPU流水线更容易?
我用它来分割字符串:
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)
可能吗?
我的问题很简单,为什么x86架构使用两个堆栈寄存器(esp ; ebp)?
堆栈帧的长度已在编译期间确定,然后我认为我们可以只使用一个寄存器(例如esp)来访问堆栈,并维护以前在ebp堆栈中(或在其他内存中的寄存器中)的基址地区,但这将导致更多的性能损失)
可能吗?
这个问题来自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上面的代码是如何工作的,有人能给我一些帮助吗?
我写信是为了询问 Z3 Optimize 功能背后的理论/算法,特别是它的maximum和minimum功能。这对我来说似乎很神奇。它是某种二分搜索吗?它如何有效地计算出这里的最大/最小值..?
我试图搜索相关函数(例如,函数execute_min_max)的源代码,但是如果没有深入理解那里的术语,它对我来说没有太大意义......基本上lex这里代表什么?似乎解决方案以某种方式保存在堆栈内。
任何建议或建议将非常感激。谢谢。