小编blu*_*sea的帖子

llvm IR代码中标签的表达

有时我发现llvm IR中的标签标识符以逗号';' ; <label> 6 开头,但是如我所知,逗号用于注释.那么llvm如何在评论中检索标签信息呢?我错过了什么吗?
遵循一个简单的测试.
C源文件:

#include <stdio.h>

int main()
{
 int a;
 scanf("%d", &a);
 if ( a > 3)
  a *= 2;
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://llvm.org/demo/index.cgi生成的llvm IR代码(与clang -c -emit-llvm main.c相同)如下:

; ModuleID = '/tmp/webcompile/_13654_0.bc'

@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1

define i32 @main() nounwind uwtable {
  %a = alloca i32, align 4
  %1 = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8]* @.str, i64 0, i64 0), i32* %a) …
Run Code Online (Sandbox Code Playgroud)

compiler-construction llvm llvm-ir

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

为什么 elf 文件中的段可以重叠

简单的C文件:

#include <stdio.h>
int main(){
    printf("Hello World");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译代码后,使用readelf -a a.out,精灵信息如下:

elf 程序头、段信息

问题:

  1. 几个部分出现在不同的段中,例如第二段和第三段中的 interp 部分。一个部分如何出现在多个部分中?
  2. 第二段的地址从 0x8048134 开始,但第三个 LOAD 段从 0x8048000 开始,0x004d0 memsize。那么这两段重叠?两个段如何在内存中重叠?
  3. 为什么程序头的偏移量和 viraddr 必须与页面大小模数一致?

assembly elf segment

5
推荐指数
2
解决办法
2844
查看次数

在不使用libelf或其他库的情况下创建ELF二进制文件

最近我试着自己在linux平台上编写一个简单的编译器.

当谈到编译器的后端时,我决定在不使用第三方库的情况下生成ELF格式的二进制文件,例如libelf.

相反,我想通过使用该write()函数并控制ELF文件的所有细节,尝试将机器代码直接写入与ELF ABI 相对应的文件中.

这种方法的优点是我可以控制编译器的所有内容.

但我犹豫了.考虑到ELF ABI的详细程度,这种方式是否可行?

我希望有任何建议和指向现有的可用资源.

c linux compiler-construction elf

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

标签 统计

compiler-construction ×2

elf ×2

assembly ×1

c ×1

linux ×1

llvm ×1

llvm-ir ×1

segment ×1