我想利用MALLOC_PERTURB_环境变量来改变内存分配参数(参见man 3 mallopt)。然而,我希望在应用程序级别控制分配参数,而不是整个系统级别。理想情况下,如果能通过项目的makefile来控制它们就好了。我尝试过通过makefile来更改上述变量,但没有成功。
为了测试,我创建了这个test.c文件:
#include<stdlib.h>
#include<stdio.h>
#define N 50
int main()
{
char *chars;
int i;
if (NULL == (chars = malloc(N * sizeof(*chars))))
return EXIT_FAILURE;
free(chars);
for (i = 0; i < N; ++i)
printf("%c", chars[i]);
printf("\n");
return EXIT_SUCCESS;
}
是的,我知道我正在读取已被释放的内存,但这正是使用MALLOC_PERTURB_的全部意义。
期望结果:值为MALLOC_PERTURB_的50个ASCII字符。
足够接近:
$ export MALLOC_PERTURB_=97
$ gcc test.c -o test
$ ./test
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa��
$ export MALLOC_PERTURB_=105
$ gcc test.c -o test
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��
我尝试将编译过程放在makefile中,但未成功。
导出变量(如此处所建议)
Makefile
all:
export MALLOC_PERTURB_=110
gcc test.c -o test
结果(我期望110个字母,但实际上不是)
$ export MALLOC_PERTURB_=105
$ make
export MALLOC_PERTURB_=110
gcc test.c -o test
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��
递归调用make命令 (如此处所提出的)
Makefile
all:
MALLOC_PERTURB_=110
$(MAKE) rec
rec:
gcc test.c -o test
结果(我期望的是110个字母,但实际得到了'n')
$ export MALLOC_PERTURB_=105
$ make
MALLOC_PERTURB_=110
make rec
make[1]: Entering directory '~/test'
gcc test.c -o test
make[1]: Leaving directory '~/test'
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��
我试图从Github的Makefile中寻找包含MALLOC_PERTURB_的灵感,但它们对我来说太复杂了无法理解。 以下是一些例子:(1)、(2)、(3)。 一些技术信息:
Linux 4.0.1-1-ARCH x86_64
gcc version 4.9.2 20150304 (prerelease) (GCC)
GNU Make 4.1
export
行后面加上分号和反斜杠,它就会起作用。目前为止,make
创建了一个运行export
的shell,然后创建另一个shell来运行测试(因此第二个shell不知道导出的变量)。我建议的是强制make
将这两行视为一行。还有一个指令,你可以添加到makefile
中,告诉GNUmake
在单个shell中运行目标的所有操作;它的名称是.ONESHELL:
。 - Jonathan Leffler