gpt4 book ai didi

c - gcc - 在 bss 中编写和执行代码 - 设置权限标志

转载 作者:IT王子 更新时间:2023-10-29 00:15:14 26 4
gpt4 key购买 nike

我在 linux 系统(确切地说是 centos 5.4)上的 C 程序中在运行时生成 x86-64 代码。

我将字节码生成到全局数组中,如下所示

char program[1024 * 1024] __attribute__((aligned (16)));

然后通过函数指针调用它。

我的问题是,当我这样编译程序时

gcc -std=gnu99 parse.c -o parse -lm

我得到一个 SIGSEGV,我推测这是由于 bss 部分未设置为可执行文件,如 pmap 所示

0000000000601000      4K rw---  /data/work/tmp/parse
0000000000602000 1024K rw--- [ anon ]

当我这样编译时,(empty.s 是一个零长度文件)

gcc -std=gnu99 parse.c empty.s -o parse -lm

在运行时,bss 部分神奇地设置了执行位,并且一切正常。

0000000000601000      4K rwx--  /data/work/tmp/parse
0000000000602000 1024K rwx-- [ anon ]

那么,这些标志是如何在 ELF 中设置的呢?是否有一种可靠、正确的方法来获得具有 rwx 权限的 bss 部分?

更多详细信息 - 软件版本

gcc 版本 4.1.2 20080704(红帽 4.1.2-48)
Linux 2.6.18-164.15.1.el5 x86_64 GNU/Linux

谢谢

更新 - 起初我认为我不能像 caf 所建议的那样使用 mmap 来解决这个问题,因为 mmap 给我返回的页面太远了(我想跳转到具有相对地址的附近代码)。事实证明,您可以要求 mmap 为您处理这件事,就像这样 - MAP_32BIT 将返回前 2GB 的页面。

char* program = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

最佳答案

您可能应该直接使用 mmap() 请求一个可写的、可执行的匿名映射来存储您生成的机器代码。

关于c - gcc - 在 bss 中编写和执行代码 - 设置权限标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com