下载并编译了glibc-2.13.当我尝试运行一个执行malloc()的示例C程序时.我得到以下错误
elf file OS ABI invalid
任何人都可以通过我的任何指针帮助解决这个问题.请注意我的内核版本是linux-2.6.35.9
我在glibc工作,我需要得到当前线程的id.为此我使用
syscall(SYS_gettid);问题是,我被迫包括bits/syscall.h而不是理想的情况即 sys/syscall.h.
sys/syscall.h 内部调用bits/syscall.h但是用#ifndef _LIBC宏包装.即
#ifndef _LIBC
/* The Linux kernel header file defines macros `__NR_<name>', but some
programs expect the traditional form `SYS_<name>'. So in building libc
we scan the kernel's list and produce <bits/syscall.h> with macros for
all the `SYS_' names. */
# include <bits/syscall.h>
#endif
Run Code Online (Sandbox Code Playgroud)
还bits/syscall.h指出"永远不要直接使用bits/syscall.h;而是包含sys/syscall.h".
由于_LIBC我将在我的情况下定义,因为我正在直接编写代码malloc.c,请建议我如何克服这个问题.
谢谢,卡皮尔
GDB观察点如何工作?是否可以实现类似的功能来利用定义位置的字节级访问?
我有小的C代码:
#include<stdio.h>
int main()
{
int z[]= {1,2,3,4,5,6};
int i = 2, j;
printf("i=%d \n",i);
z[i] = i++;
for (j=0;j < 6;j++ )
printf ("%d ", z[j]);
printf("\ni=%d \n",i);
}
Run Code Online (Sandbox Code Playgroud)
输出:
i=2
1 2 2 4 5 6
i=3
Run Code Online (Sandbox Code Playgroud)
评估表达式的优先顺序为首先,评估z [i]。当我在这里是2时,它变为z [2]。接下来,对i ++求值,即产生2且i变为3。最后,执行=,并将2(即从i ++产生的值)放入z [2]。
这解释了上面的输出,即1 2 2 4 5 6
但是如果我们将上面的代码从i ++更改为++ i即
#include<stdio.h>
int main()
{
int z[]= {1,2,3,4,5,6};
int i = 2, j;
printf("i=%d \n",i);
z[i] = ++i;
for (j=0;j < 6;j++ )
printf ("%d ", z[j]); …Run Code Online (Sandbox Code Playgroud) 任何对glibc malloc代码有一些基本想法的人都可以告诉我如何迭代所有竞技场并找出哪些是没有被释放的块,即它们的使用位被设置.我必须在退出流程时这样做.
要么
更确定的是,如果我们有一个竞技场,我们可以访问其中分配的第一个块吗?
感谢大家花时间回复.很长一段时间我发布了这个问题.'Phrack'在这些问题中列出了一些黑客技术.我受益于此.
问候,卡皮尔
保护页面以进行读和/或写访问是可能的,因为页表条目中的位可以在内核级别打开和关闭.有没有一种方法可以保护某些内存区域免受写访问,比如说在C结构中有某些需要写保护的变量,对它们的任何写访问都会触发段错误和核心转储.它类似于mprotect()的缩小功能,因为它在页面级别工作,在用户空间的字节级别存在类似事物的机制.
谢谢,Kapil Upadhayay.
glibc ×3
c ×2
linux-kernel ×2
malloc ×2
abi ×1
debugging ×1
gcc ×1
gdb ×1
hardware ×1
libc ×1
linux ×1
mprotect ×1
system-calls ×1
watchpoint ×1