是否可以通过makefile设置环境变量?

bro*_*ng0 3 c unix malloc makefile gnu-make

我想利用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;
}
Run Code Online (Sandbox Code Playgroud)

是的,我知道我正在从释放的内存中进行读取,但这是使用MALLOC_PERTURB_的全部重点。

预期结果:50个字符的ASCII字符,值MALLOC_PERTURB_。

足够近:

$ export MALLOC_PERTURB_=97
$ gcc test.c -o test
$ ./test
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa??


$ export MALLOC_PERTURB_=105
$ gcc test.c -o test
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii??
Run Code Online (Sandbox Code Playgroud)

然后,我尝试将编译包含在makefile中,但没有成功。

导出变量 (如此处建议)

生成文件

all:
    export MALLOC_PERTURB_=110
    gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

结果(我期望110个字母为n)

$ export MALLOC_PERTURB_=105
$ make
export MALLOC_PERTURB_=110
gcc test.c -o test 
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii??
Run Code Online (Sandbox Code Playgroud)

递归调用make (如此处所建议)

生成文件

all:
    MALLOC_PERTURB_=110
    $(MAKE) rec

rec:
    gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

结果(我期望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??
Run Code Online (Sandbox Code Playgroud)

我试图从包含MALLOC_PERTURB_的github的makefile中找到任何启​​发,但是它们太复杂了,我无法理解。一些示例:(1)(2)(3)

一些技术信息:

Linux 4.0.1-1-ARCH x86_64
gcc version 4.9.2 20150304 (prerelease) (GCC)
GNU Make 4.1
Run Code Online (Sandbox Code Playgroud)

Ata*_*far 5

在Bash中,您可以在命令前面指定环境变量,例如,

MALLOC_PERTURB_=105 gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

要么

MALLOC_PERTURB_=105 ./test
Run Code Online (Sandbox Code Playgroud)

(我相信只有运行必须设置此变量,而不是编译。)

由于您使用的是Linux,因此Make很有可能将Bash用作shell,并且可以将上述行放在makefile中。

  • 那不是bash特有的:像Bourne shell一样的* any * shell可以做到这一点。 (3认同)