static void buildid__show_kernel_maps(void)
 {
+       struct perf_env host_env;
        struct machine *machine;
 
-       machine = machine__new_host();
+       perf_env__init(&host_env);
+       machine = machine__new_host(&host_env);
        machine__for_each_kernel_map(machine, buildid__map_cb, NULL);
        machine__delete(machine);
+       perf_env__exit(&host_env);
 }
 
 static int sysfs__fprintf_build_id(FILE *fp)
 
 #include <subcmd/parse-options.h>
 #include "debug.h"
 #include "dso.h"
+#include "env.h"
 #include "machine.h"
 #include "map.h"
 #include "symbol.h"
 
 static int __cmd_kallsyms(int argc, const char **argv)
 {
-       int i;
-       struct machine *machine = machine__new_kallsyms();
+       int i, err;
+       struct perf_env host_env;
+       struct machine *machine = NULL;
 
+
+       perf_env__init(&host_env);
+       err = perf_env__set_cmdline(&host_env, argc, argv);
+       if (err)
+               goto out;
+
+       machine = machine__new_kallsyms(&host_env);
        if (machine == NULL) {
                pr_err("Couldn't read /proc/kallsyms\n");
-               return -1;
+               err = -1;
+               goto out;
        }
 
        for (i = 0; i < argc; ++i) {
                        map__unmap_ip(map, symbol->start), map__unmap_ip(map, symbol->end),
                        symbol->start, symbol->end);
        }
-
+out:
        machine__delete(machine);
-       return 0;
+       perf_env__exit(&host_env);
+       return err;
 }
 
 int cmd_kallsyms(int argc, const char **argv)
 
 };
 
 struct trace {
+       struct perf_env         host_env;
        struct perf_tool        tool;
        struct {
                /** Sorted sycall numbers used by the trace. */
        return machine__resolve_kernel_addr(vmachine, addrp, modp);
 }
 
-static int trace__symbols_init(struct trace *trace, struct evlist *evlist)
+static int trace__symbols_init(struct trace *trace, int argc, const char **argv,
+                              struct evlist *evlist)
 {
        int err = symbol__init(NULL);
 
        if (err)
                return err;
 
-       trace->host = machine__new_host();
-       if (trace->host == NULL)
-               return -ENOMEM;
+       perf_env__init(&trace->host_env);
+       err = perf_env__set_cmdline(&trace->host_env, argc, argv);
+       if (err)
+               goto out;
 
+       trace->host = machine__new_host(&trace->host_env);
+       if (trace->host == NULL) {
+               err = -ENOMEM;
+               goto out;
+       }
        thread__set_priv_destructor(thread_trace__delete);
 
        err = trace_event__register_resolver(trace->host, trace__machine__resolve_kernel_addr);
                                            evlist->core.threads, trace__tool_process,
                                            true, false, 1);
 out:
-       if (err)
+       if (err) {
+               perf_env__exit(&trace->host_env);
                symbol__exit();
-
+       }
        return err;
 }
 
        machine__exit(trace->host);
        trace->host = NULL;
 
+       perf_env__exit(&trace->host_env);
        symbol__exit();
 }
 
                goto out_delete_evlist;
        }
 
-       err = trace__symbols_init(trace, evlist);
+       err = trace__symbols_init(trace, argc, argv, evlist);
        if (err < 0) {
                fprintf(trace->output, "Problems initializing symbol libraries!\n");
                goto out_delete_evlist;
 
 
        pid = getpid();
 
-       machine = machine__new_host();
        perf_env__init(&host_env);
-       machine->env = &host_env;
+       machine = machine__new_host(&host_env);
 
        ret = machine__create_kernel_maps(machine);
        if (ret < 0) {
 
                return test_result("Failed to find program symbols", TEST_FAIL);
 
        pr_debug("Creating new host machine structure\n");
-       td->machine = machine__new_host();
        perf_env__init(&host_env);
-       td->machine->env = &host_env;
+       td->machine = machine__new_host(&host_env);
 
        td->fd = creat(td->perf_data_file_name, 0644);
        if (td->fd < 0)
 
 #include <unistd.h>
 #include "tests.h"
 #include "debug.h"
+#include "env.h"
 #include "machine.h"
 #include "event.h"
 #include "../util/unwind.h"
 noinline int test__dwarf_unwind(struct test_suite *test __maybe_unused,
                                int subtest __maybe_unused)
 {
+       struct perf_env host_env;
        struct machine *machine;
        struct thread *thread;
        int err = -1;
        callchain_param.record_mode = CALLCHAIN_DWARF;
        dwarf_callchain_users = true;
 
-       machine = machine__new_live(/*kernel_maps=*/true, pid);
+       perf_env__init(&host_env);
+       machine = machine__new_live(&host_env, /*kernel_maps=*/true, pid);
        if (!machine) {
                pr_err("Could not get machine\n");
-               return -1;
+               goto out;
        }
 
        if (machine__create_kernel_maps(machine)) {
                pr_err("Failed to create kernel maps\n");
-               return -1;
+               goto out;
        }
 
        if (verbose > 1)
 
  out:
        machine__delete(machine);
+       perf_env__exit(&host_env);
        return err;
 }
 
 
 #include <stdlib.h>
 #include <stdio.h>
 #include "debug.h"
+#include "env.h"
 #include "event.h"
 #include "tests.h"
 #include "machine.h"
 
 static int mmap_events(synth_cb synth)
 {
+       struct perf_env host_env;
        struct machine *machine;
        int err, i;
 
         */
        TEST_ASSERT_VAL("failed to create threads", !threads_create());
 
-       machine = machine__new_host();
+       perf_env__init(&host_env);
+       machine = machine__new_host(&host_env);
 
        dump_trace = verbose > 1 ? 1 : 0;
 
        }
 
        machine__delete(machine);
+       perf_env__exit(&host_env);
        return err;
 }
 
 
 #include <limits.h>
 #include "debug.h"
 #include "dso.h"
+#include "env.h"
 #include "machine.h"
 #include "thread.h"
 #include "symbol.h"
 #include "tests.h"
 
 struct test_info {
+       struct perf_env host_env;
        struct machine *machine;
        struct thread *thread;
 };
 
 static int init_test_info(struct test_info *ti)
 {
-       ti->machine = machine__new_host();
+       perf_env__init(&ti->host_env);
+       ti->machine = machine__new_host(&ti->host_env);
        if (!ti->machine) {
                pr_debug("machine__new_host() failed!\n");
+               perf_env__exit(&ti->host_env);
                return TEST_FAIL;
        }
 
        ti->thread = machine__findnew_thread(ti->machine, 100, 100);
        if (!ti->thread) {
                pr_debug("machine__findnew_thread() failed!\n");
+               perf_env__exit(&ti->host_env);
                return TEST_FAIL;
        }
 
 {
        thread__put(ti->thread);
        machine__delete(ti->machine);
+       perf_env__exit(&ti->host_env);
 }
 
 struct dso_map {
 
 #include "addr_location.h"
 #include "color.h"
 #include "debug.h"
+#include "env.h"
 #include "event.h"
 #include "machine.h"
 #include "map.h"
 {
        /* TODO: async safety. printf, malloc, etc. aren't safe inside a signal handler. */
        pid_t pid = getpid();
-       struct machine *machine = machine__new_live(/*kernel_maps=*/false, pid);
+       struct machine *machine;
        struct thread *thread = NULL;
+       struct perf_env host_env;
+
+       perf_env__init(&host_env);
+       machine = machine__new_live(&host_env, /*kernel_maps=*/false, pid);
 
        if (machine)
                thread = machine__find_thread(machine, pid, pid);
                 */
                backtrace_symbols_fd(stackdump, stackdump_size, fileno(file));
                machine__delete(machine);
+               perf_env__exit(&host_env);
                return;
        }
 #endif
        }
        thread__put(thread);
        machine__delete(machine);
+       perf_env__exit(&host_env);
 }
 
 /* Obtain a backtrace and print it to stdout. */
 
        return 0;
 }
 
-static struct machine *__machine__new_host(bool kernel_maps)
+static struct machine *__machine__new_host(struct perf_env *host_env, bool kernel_maps)
 {
        struct machine *machine = malloc(sizeof(*machine));
 
                free(machine);
                return NULL;
        }
-       machine->env = &perf_env;
+       machine->env = host_env;
        return machine;
 }
 
-struct machine *machine__new_host(void)
+struct machine *machine__new_host(struct perf_env *host_env)
 {
-       return __machine__new_host(/*kernel_maps=*/true);
+       return __machine__new_host(host_env, /*kernel_maps=*/true);
 }
 
 static int mmap_handler(const struct perf_tool *tool __maybe_unused,
                                                  mmap_handler, machine, true);
 }
 
-struct machine *machine__new_live(bool kernel_maps, pid_t pid)
+struct machine *machine__new_live(struct perf_env *host_env, bool kernel_maps, pid_t pid)
 {
-       struct machine *machine = __machine__new_host(kernel_maps);
+       struct machine *machine = __machine__new_host(host_env, kernel_maps);
 
        if (!machine)
                return NULL;
        return machine;
 }
 
-struct machine *machine__new_kallsyms(void)
+struct machine *machine__new_kallsyms(struct perf_env *host_env)
 {
-       struct machine *machine = machine__new_host();
+       struct machine *machine = machine__new_host(host_env);
        /*
         * FIXME:
         * 1) We should switch to machine__load_kallsyms(), i.e. not explicitly
 
 void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size);
 void machines__set_comm_exec(struct machines *machines, bool comm_exec);
 
-struct machine *machine__new_host(void);
-struct machine *machine__new_kallsyms(void);
-struct machine *machine__new_live(bool kernel_maps, pid_t pid);
+struct machine *machine__new_host(struct perf_env *host_env);
+struct machine *machine__new_kallsyms(struct perf_env *host_env);
+struct machine *machine__new_live(struct perf_env *host_env, bool kernel_maps, pid_t pid);
 int machine__init(struct machine *machine, const char *root_dir, pid_t pid);
 void machine__exit(struct machine *machine);
 void machine__delete_threads(struct machine *machine);
 
 }
 
 static struct machine *host_machine;
+static struct perf_env host_env;
 
 /* Initialize symbol maps and path of vmlinux/modules */
 int init_probe_symbol_maps(bool user_only)
 {
        int ret;
 
+       perf_env__init(&host_env);
        symbol_conf.allow_aliases = true;
        ret = symbol__init(NULL);
        if (ret < 0) {
        if (symbol_conf.vmlinux_name)
                pr_debug("Use vmlinux: %s\n", symbol_conf.vmlinux_name);
 
-       host_machine = machine__new_host();
+       host_machine = machine__new_host(&host_env);
        if (!host_machine) {
                pr_debug("machine__new_host() failed.\n");
                symbol__exit();
        machine__delete(host_machine);
        host_machine = NULL;
        symbol__exit();
+       perf_env__exit(&host_env);
 }
 
 static struct ref_reloc_sym *kernel_get_ref_reloc_sym(struct map **pmap)