首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以通过makefile设置环境变量?

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

Stack Overflow用户
提问于 2015-06-07 06:04:13
回答 3查看 1.4K关注 0票数 3

我想利用可以更改内存分配参数的MALLOC_PERTURB_环境变量(Man3mallopt)。但是,我希望在应用程序级别控制分配参数,而不是整个系统级别。理想情况下,如果我可以通过项目的makefile来控制它们。我曾尝试通过makefile更改上述变量,但均未成功。

为了测试,我创建了这个test.c文件:

代码语言:javascript
复制
#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字符。

足够接近:

代码语言:javascript
复制
$ export MALLOC_PERTURB_=97
$ gcc test.c -o test
$ ./test
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa��


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

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

导出variable (as proposed here)

Makefile

代码语言:javascript
复制
all:
    export MALLOC_PERTURB_=110
    gcc test.c -o test

结果(我期望的是110的'n‘字母)

代码语言:javascript
复制
$ export MALLOC_PERTURB_=105
$ make
export MALLOC_PERTURB_=110
gcc test.c -o test 
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��

递归调用make (as proposed here)

Makefile

代码语言:javascript
复制
all:
    MALLOC_PERTURB_=110
    $(MAKE) rec

rec:
    gcc test.c -o test

结果(我期望的是110的'n‘字母)

代码语言:javascript
复制
$ 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的包含MALLOC_PERTURB_的makefile中寻找任何灵感,但它们太复杂了,我无法理解。例如:(1)(2)(3)

一些技术信息:

代码语言:javascript
复制
Linux 4.0.1-1-ARCH x86_64
gcc version 4.9.2 20150304 (prerelease) (GCC)
GNU Make 4.1
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-07 07:05:48

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-06-07 06:28:58

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

代码语言:javascript
复制
MALLOC_PERTURB_=105 gcc test.c -o test

代码语言:javascript
复制
MALLOC_PERTURB_=105 ./test

(我相信只有运行时才需要设置这个变量,而不是编译。)

由于您使用的是Linux,因此Make很有可能会使用Bash作为shell,您可以将上面的代码行放入makefile中。

票数 5
EN

Stack Overflow用户

发布于 2015-06-07 09:52:27

您也可以在编译时通过将M_PERTURB选项传递给mallopt()函数(glibc2.4或更高版本)来设置"MALLOC_PERTURB_“值。详情请参见http://man7.org/linux/man-pages/man3/mallopt.3.html

因此,如果您希望您的程序在编译时合并环境变量"MALLOC_PERTURB_“的设置,那么下面这样的代码应该是有效的:

代码语言:javascript
复制
#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_值作为宏定义传递到编译器命令行(或您想要使用的任何机制):

代码语言:javascript
复制
gcc -DMALLOC_PERTURB_=97 test.c -o test
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30687997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档