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

时间:2015-06-06 22:04:13

标签: c unix makefile malloc 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;
}

是的,我知道我正在阅读释放的记忆,但这完全是使用MALLOC_PERTURB _。

预期结果:50个字符的值为MALLOC_PERTURB的ASCII字符_。

足够近:

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


$ export MALLOC_PERTURB_=105
$ gcc test.c -o test
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��

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

导出变量 (as proposed here)

生成文件

all:
    export MALLOC_PERTURB_=110
    gcc test.c -o test

结果(我期待&#39; n&#39;字母为110)

$ export MALLOC_PERTURB_=105
$ make
export MALLOC_PERTURB_=110
gcc test.c -o test 
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��

以递归方式调用 (as proposed here)

生成文件

all:
    MALLOC_PERTURB_=110
    $(MAKE) rec

rec:
    gcc test.c -o test

结果(我期待&#39; n&#39;字母为110)

$ 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��

我试图从包含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

3 个答案:

答案 0 :(得分:4)

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

MALLOC_PERTURB_=105 gcc test.c -o test

MALLOC_PERTURB_=105 ./test

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

由于你在Linux上,很有可能Make将使用Bash作为shell,你可以将上面的行放在你的makefile中。

答案 1 :(得分:2)

Browning,在makefile中设置环境变量很容易,而且你已经这样做了,但这不是你想要的。这使得它在编译期间获取该值。但是你希望它在你运行程序时改变malloc的行为。

读取您引用的手册页确认您需要在运行程序的环境中设置环境变量。同时阅读这些评论,已经提到设置环境变量的makefile只对测试程序这样做,它们实际上是作为构建的一部分运行的。

你不希望它出现在makefile中。您希望在实际运行程序时设置它,这是其他注释和答案告诉您如何操作。很抱歉接受了答案,但我需要更多的空间来清除它,而且这是答案,对你而言。你已经知道怎么做了。你完全不知道它到底是什么。

答案 2 :(得分:1)

您可以在编译时设置“MALLOC_PERTURB_”值,方法是将M_PERTURB选项传递给mallopt()函数(glibc 2.4或更高版本)。有关详细信息,请参阅http://man7.org/linux/man-pages/man3/mallopt.3.html

因此,如果您希望程序在编译时合并环境变量“MALLOC_PERTURB_”的设置,那么这样的事情应该有效:

#include<stdlib.h>
#include<stdio.h>

#include <malloc.h> // for mallopt() and M_PERTURB

#define N 50

int main()
{
    char *chars;
    int i;

#if MALLOC_PERTURB_
    mallopt( M_PERTURB, MALLOC_PERTURB_);
#endif

    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;
}

然后让你的makefile在编译器命令行(或你想要使用的任何机制)上将MALLOC_PERTURB_值作为宏定义传递:

gcc -DMALLOC_PERTURB_=97 test.c -o test