- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我试图用动态生成的代码做一些讨厌的骇人听闻的事情,我希望操作系统在遇到未知操作码时向我发送一个 SIGILL。这会让我添加一层关于我的程序的元信息等等。
但是,对于我的小测试程序,操作系统似乎没有发送 SIGILL,而是发送了 SIGBUS 或 SIGSEGV。我猜这意味着内存所在的页面上设置了一个 NX 位。
关于如何使内存可执行的任何提示?
作为引用,这是我的测试程序:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
void SIGILL_handler(int sig)
{
printf("Handling SIGILL\n");
}
typedef void(*FUNC)(void);
int main()
{
signal(SIGILL, SIGILL_handler);
int *bad = malloc(16);
memset(bad, 255, 16);
((FUNC)bad)();
printf("Returning like it's no big deal\n");
return 0;
}
最佳答案
mprotect
是你的 friend 。它与 POSIX 兼容(SVr4,POSIX.1-2001),因此它应该在 OS X 和 Linux 下工作。
int pagesize = sysconf(_SC_PAGE_SIZE);
if (pagesize == -1) {
perror("sysconf");
exit(1);
}
/* allocate 16 aligned pages */
void *bad = memalign(pagesize, 16 * pagesize);
if (NULL == bad) {
fprintf("aah, out of mem :-(\n");
exit(1);
}
if (-1 == mprotect(bad, 16 * pagesize, PROT_READ | PROT_WRITE | PROT_EXEC)) {
perror("mprotect");
exit(1);
}
应该这样做。
第二次编辑:memalign
的兼容性似乎没那么容易。我会在 OS X 和 Linux 下尝试 memalign
、valloc
,如果都不起作用,只需使用常规 malloc
并向返回的指针添加足够的字节这样它就对齐了:-)。
关于c - 如何强制将 SIGILL 发送到我的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9314270/
当玩家四处走动时,我的服务器有时会崩溃。我尝试使用调试器运行它,服务器收到错误:程序收到信号 SIGILL,非法指令。 它显示 LogicHandler 中的第 59 行。这是函数运行。这是该函数:
我想使用 Sigil 将字体系列更改为嵌入式字体。我相信我已经在 CSS 中做好了一切。我在 Sigil 中导入了“1984”字体。 我已阅读本教程:http://www.pigsgourdsandw
我正在为我的安全类开发我的缓冲区溢出项目,我认为我已经正确设置了所有内容,但是当我运行它时我得到: Program received signal SIGILL, Illegal Instructio
我正在使用 NDK 和 GCC 将一些 C++ 代码移植到 Android。代码基本上运行。有一次,在 Eclipse 中调试时,调用 Dabbler::Android::Factory* pFact
在我学习 Elixir 的过程中,我正在尝试制作一个简单的符号来解析 csv。 我已经设法制作了一个印记来做到这一点,但是我找不到一种方法让它与特殊字符一起工作,例如 ; . defmodule Co
我的问题总结在标题中。当我调用方法 setHtml在 QtWebPageRenderer 的实例上,发出 SIGILL 信号,我的应用程序出现故障。 我知道这个问题是由糟糕的 Qt5 动态库引起的,但
这些都是有效的指令,直到 0x7fffffffdbe4 ,此时程序已经调用了退出系统调用。 gdb) x/20i $rip => 0x7fffffffdbb0: movabs rax,0x2
我有一个问题,我必须在两个战士之间的战斗中返回获胜者的名字。fighter类如下: class Fighter { private: std::string name; int health; int
我已经得到了答案,所以我只是发布这个,以防其他像我一样糟糕的编码员遇到这个问题。 (虽然有些黑魔法可能有人可以解释)。 我正在 Android 设备(Samsung Galaxy S7,尽管该问题很可
错误信号 4 SIGILL 对我来说是新的。当我查看墓碑文件并输入 int 他的地址时,我得到了 ??即 这是一些墓碑: *** *** *** *** *** *** *** *** *** ***
是否可以将枚举作为参数传递给可变参数函数?我正在尝试执行以下操作: GLenum ShaderManager::initialize() { GLuint program = loadShad
我正在尝试在 BeagleBone Black 上调试程序。在调试器之外,它会产生不正确的结果,但不会产生 SIGILL。它在调试器下也运行正常,没有断点。但是,它会在单步执行时生成带有断点设置的 S
我试图用动态生成的代码做一些讨厌的骇人听闻的事情,我希望操作系统在遇到未知操作码时向我发送一个 SIGILL。这会让我添加一层关于我的程序的元信息等等。 但是,对于我的小测试程序,操作系统似乎没有发送
我正在使用 Linux x86_64 机器来构建我的程序。我已将共享库链接到可执行文件。在我的项目中,我正在调用一个声明 vector 的函数函数内部。当该函数被调用时,我的程序被杀死。下面是通过GD
我正在尝试添加«€»作为«$»标量的别名,我认为使用俚语是这样做的。但是 perl6.doc 根本没有提到俚语。 我已阅读以下内容: https://perlgeek.de/en/article/mu
昨天,我发布了我的应用程序的新版本,今天我发现,很多从旧版本升级的用户都遇到了崩溃。 检查崩溃日志后,我仍然找不到问题所在,所以我来这里寻求帮助。 崩溃日志显示,未知线程崩溃,看起来应用程序尚未完成启
我收到以下代码的奇怪错误: #include #include #include inline static double myfma(double x,double y, double z)
我有一个 NDK 应用程序上市,并获得了关于 SIGILL 信号的 native 崩溃报告。 (我使用 google breakpad 生成 native 崩溃报告。)以下是详细信息: 我的应用是为
在我的应用程序中,我希望能够播放流式视频(通过 RTSP 协议(protocol))。我找到了开放的 RTSP 流:rtsp://red7blue.de/Primetime 并尝试播放它。但是我的应用
我编写了一个在 MIPS 32 位路由器上运行的小型 go 程序。我能够使用 go build 工具链在路由器上运行一个基本的 hello world 程序。 env GOOS=linux GOARC
我是一名优秀的程序员,十分优秀!