}
 
        if (!annotate_opts.objdump_path) {
-               ret = perf_env__lookup_objdump(&session->header.env,
+               ret = perf_env__lookup_objdump(perf_session__env(session),
                                               &annotate_opts.objdump_path);
                if (ret)
                        goto out;
 
        symbol_conf.try_vmlinux_path = true;
 
-       ret = symbol__init(&annotate.session->header.env);
+       ret = symbol__init(perf_session__env(annotate.session));
        if (ret < 0)
                goto out_delete;
 
 
                        return PTR_ERR(session);
        }
 
-       if (symbol__init(session ? &session->header.env : NULL) < 0)
+       if (symbol__init(session ? perf_session__env(session) : NULL) < 0)
                goto out;
 
        setup_pager();
 
        int node, idx;
        struct perf_cpu cpu;
        int *cpu2node;
+       struct perf_env *env = perf_session__env(session);
 
        if (c2c.node_info > 2)
                c2c.node_info = 2;
 
-       c2c.nodes_cnt = session->header.env.nr_numa_nodes;
-       c2c.cpus_cnt  = session->header.env.nr_cpus_avail;
+       c2c.nodes_cnt = env->nr_numa_nodes;
+       c2c.cpus_cnt  = env->nr_cpus_avail;
 
-       n = session->header.env.numa_nodes;
+       n = env->numa_nodes;
        if (!n)
                return -EINVAL;
 
        };
        int err = 0;
        const char *output_str, *sort_str = NULL;
+       struct perf_env *env;
 
        argc = parse_options(argc, argv, options, report_c2c_usage,
                             PARSE_OPT_STOP_AT_NON_OPTION);
                pr_debug("Error creating perf session\n");
                goto out;
        }
-
+       env = perf_session__env(session);
        /*
         * Use the 'tot' as default display type if user doesn't specify it;
         * since Arm64 platform doesn't support HITMs flag, use 'peer' as the
         * default display type.
         */
        if (!display) {
-               if (!strcmp(perf_env__arch(&session->header.env), "arm64"))
+               if (!strcmp(perf_env__arch(env), "arm64"))
                        display = "peer";
                else
                        display = "tot";
                goto out_session;
        }
 
-       err = mem2node__init(&c2c.mem2node, &session->header.env);
+       err = mem2node__init(&c2c.mem2node, env);
        if (err)
                goto out_session;
 
        if (err)
                goto out_mem2node;
 
-       if (symbol__init(&session->header.env) < 0)
+       if (symbol__init(env) < 0)
                goto out_mem2node;
 
        /* No pipe support at the moment. */
 
                inject.tool.finished_round = perf_event__drop_oe;
        }
 #endif
-       ret = symbol__init(&inject.session->header.env);
+       ret = symbol__init(perf_session__env(inject.session));
        if (ret < 0)
                goto out_delete;
 
 
                symbol_conf.use_callchain = true;
        }
 
-       symbol__init(&session->header.env);
+       symbol__init(perf_session__env(session));
 
        if (perf_time__parse_str(&ptime, time_str) != 0) {
                pr_err("Invalid time string\n");
 
                }
                cpuid = buf;
        } else
-               cpuid = kvm->session->header.env.cpuid;
+               cpuid = perf_session__env(kvm->session)->cpuid;
 
        if (!cpuid) {
                pr_err("Failed to look up CPU type\n");
                return PTR_ERR(kvm->session);
        }
 
-       symbol__init(&kvm->session->header.env);
+       symbol__init(perf_session__env(kvm->session));
 
        if (!perf_session__has_traces(kvm->session, "kvm record")) {
                ret = -EINVAL;
 
                return PTR_ERR(session);
        }
 
-       symbol__init(&session->header.env);
+       symbol__init(perf_session__env(session));
 
        if (perf_kwork__check_config(kwork, session) != 0)
                goto out_delete;
 
        }
 
        symbol_conf.allow_aliases = true;
-       symbol__init(&session->header.env);
+       symbol__init(perf_session__env(session));
 
        if (!data.is_pipe) {
                if (!perf_session__has_traces(session, "lock record"))
                con.save_callstack = true;
 
        symbol_conf.allow_aliases = true;
-       symbol__init(&session->header.env);
+       symbol__init(perf_session__env(session));
 
        if (use_bpf) {
                err = target__validate(&target);
 
                        goto out_delete;
        }
 
-       ret = symbol__init(&session->header.env);
+       ret = symbol__init(perf_session__env(session));
        if (ret < 0)
                goto out_delete;
 
 
                        }
                }
 
-               if (evlist__add_bpf_sb_event(rec->sb_evlist, &rec->session->header.env)) {
+               if (evlist__add_bpf_sb_event(rec->sb_evlist, perf_session__env(rec->session))) {
                        pr_err("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n.");
                        return -1;
                }
        struct perf_session *session = rec->session;
        struct timespec ref_clockid;
        struct timeval ref_tod;
+       struct perf_env *env = perf_session__env(session);
        u64 ref;
 
        if (!rec->opts.use_clockid)
                return 0;
 
        if (rec->opts.use_clockid && rec->opts.clockid_res_ns)
-               session->header.env.clock.clockid_res_ns = rec->opts.clockid_res_ns;
+               env->clock.clockid_res_ns = rec->opts.clockid_res_ns;
 
-       session->header.env.clock.clockid = rec->opts.clockid;
+       env->clock.clockid = rec->opts.clockid;
 
        if (gettimeofday(&ref_tod, NULL) != 0) {
                pr_err("gettimeofday failed, cannot set reference time.\n");
        ref = (u64) ref_tod.tv_sec * NSEC_PER_SEC +
              (u64) ref_tod.tv_usec * NSEC_PER_USEC;
 
-       session->header.env.clock.tod_ns = ref;
+       env->clock.tod_ns = ref;
 
        ref = (u64) ref_clockid.tv_sec * NSEC_PER_SEC +
              (u64) ref_clockid.tv_nsec;
 
-       session->header.env.clock.clockid_ns = ref;
+       env->clock.clockid_ns = ref;
        return 0;
 }
 
        int fd;
        float ratio = 0;
        enum evlist_ctl_cmd cmd = EVLIST_CTL_CMD_UNSUPPORTED;
+       struct perf_env *env;
 
        atexit(record__sig_exit);
        signal(SIGCHLD, sig_handler);
                pr_err("Perf session creation failed.\n");
                return PTR_ERR(session);
        }
-
+       env = perf_session__env(session);
        if (record__threads_enabled(rec)) {
                if (perf_data__is_pipe(&rec->data)) {
                        pr_err("Parallel trace streaming is not available in pipe mode.\n");
        }
 #endif // HAVE_EVENTFD_SUPPORT
 
-       session->header.env.comp_type  = PERF_COMP_ZSTD;
-       session->header.env.comp_level = rec->opts.comp_level;
+       env->comp_type  = PERF_COMP_ZSTD;
+       env->comp_level = rec->opts.comp_level;
 
        if (rec->opts.kcore &&
            !record__kcore_readable(&session->machines.host)) {
        }
        /* Debug message used by test scripts */
        pr_debug3("perf record done opening and mmapping events\n");
-       session->header.env.comp_mmap_len = session->evlist->core.mmap_len;
+       env->comp_mmap_len = session->evlist->core.mmap_len;
 
        if (rec->opts.kcore) {
                err = record__kcore_copy(&session->machines.host, data);
 
        if (rec->session->bytes_transferred && rec->session->bytes_compressed) {
                ratio = (float)rec->session->bytes_transferred/(float)rec->session->bytes_compressed;
-               session->header.env.comp_ratio = ratio + 0.5;
+               env->comp_ratio = ratio + 0.5;
        }
 
        if (forks) {
 
                }
        }
 
-       callchain_param_setup(sample_type, perf_env__arch(&rep->session->header.env));
+       callchain_param_setup(sample_type, perf_env__arch(perf_session__env(rep->session)));
 
        if (rep->stitch_lbr && (callchain_param.record_mode != CALLCHAIN_LBR)) {
                ui__warning("Can't find LBR callchain. Switch off --stitch-lbr.\n"
        evlist__for_each_entry(evlist, pos) {
                ret = report__browse_block_hists(&rep->block_reports[i++].hist,
                                                 rep->min_percent, pos,
-                                                &rep->session->header.env);
+                                                perf_session__env(rep->session));
                if (ret != 0)
                        return ret;
        }
                }
 
                ret = evlist__tui_browse_hists(evlist, help, NULL, rep->min_percent,
-                                              &session->header.env, true);
+                                              perf_session__env(session), true);
                /*
                 * Usually "ret" is the last pressed key, and we only
                 * care if the key notifies us to switch data file.
                annotation_config__init();
        }
 
-       if (symbol__init(&session->header.env) < 0)
+       if (symbol__init(perf_session__env(session)) < 0)
                goto error;
 
        if (report.time_str) {
 
                return PTR_ERR(session);
        }
 
-       symbol__init(&session->header.env);
+       symbol__init(perf_session__env(session));
 
        /* prefer sched_waking if it is captured */
        if (evlist__find_tracepoint_by_name(session->evlist, "sched:sched_waking"))
        };
 
        struct perf_session *session;
+       struct perf_env *env;
        struct evlist *evlist;
        int err = -1;
 
        if (IS_ERR(session))
                return PTR_ERR(session);
 
+       env = perf_session__env(session);
        if (cpu_list) {
                err = perf_session__cpu_bitmap(session, cpu_list, cpu_bitmap);
                if (err < 0)
 
        evlist = session->evlist;
 
-       symbol__init(&session->header.env);
+       symbol__init(env);
 
        if (perf_time__parse_str(&sched->ptime, sched->time_str) != 0) {
                pr_err("Invalid time string\n");
                goto out;
 
        /* pre-allocate struct for per-CPU idle stats */
-       sched->max_cpu.cpu = session->header.env.nr_cpus_online;
+       sched->max_cpu.cpu = env->nr_cpus_online;
        if (sched->max_cpu.cpu == 0)
                sched->max_cpu.cpu = 4;
        if (init_idle_threads(sched->max_cpu.cpu))
 
                }
        }
 
-       if (tod && !session->header.env.clock.enabled) {
+       if (tod && !perf_session__env(session)->clock.enabled) {
                pr_err("Can't provide 'tod' time, missing clock data. "
                       "Please record with -k/--clockid option.\n");
                return -1;
        if (buflen < 64 || !script)
                return buf;
 
-       env = &script->session->header.env;
+       env = perf_session__env(script->session);
        if (!env->clock.enabled) {
                scnprintf(buf, buflen, "disabled");
                return buf;
                "perf script [<options>] <top-script> [script-args]",
                NULL
        };
+       struct perf_env *env;
 
        perf_set_singlethreaded();
 
        if (IS_ERR(session))
                return PTR_ERR(session);
 
+       env = perf_session__env(session);
        if (header || header_only) {
                script.tool.show_feat_hdr = SHOW_FEAT_HEADER;
                perf_session__fprintf_info(session, stdout, show_full_info);
        if (show_full_info)
                script.tool.show_feat_hdr = SHOW_FEAT_HEADER_FULL_INFO;
 
-       if (symbol__init(&session->header.env) < 0)
+       if (symbol__init(env) < 0)
                goto out_delete;
 
        uname(&uts);
        if (data.is_pipe) { /* Assume pipe_mode indicates native_arch */
                native_arch = true;
-       } else if (session->header.env.arch) {
-               if (!strcmp(uts.machine, session->header.env.arch))
+       } else if (env->arch) {
+               if (!strcmp(uts.machine, env->arch))
                        native_arch = true;
                else if (!strcmp(uts.machine, "x86_64") &&
-                        !strcmp(session->header.env.arch, "i386"))
+                        !strcmp(env->arch, "i386"))
                        native_arch = true;
        }
 
 
 static struct aggr_cpu_id perf_stat__get_socket_file(struct perf_stat_config *config __maybe_unused,
                                                     struct perf_cpu cpu)
 {
-       return perf_env__get_socket_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_socket_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 static struct aggr_cpu_id perf_stat__get_die_file(struct perf_stat_config *config __maybe_unused,
                                                  struct perf_cpu cpu)
 {
-       return perf_env__get_die_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_die_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 
 static struct aggr_cpu_id perf_stat__get_cluster_file(struct perf_stat_config *config __maybe_unused,
                                                      struct perf_cpu cpu)
 {
-       return perf_env__get_cluster_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_cluster_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 
 static struct aggr_cpu_id perf_stat__get_cache_file(struct perf_stat_config *config __maybe_unused,
                                                    struct perf_cpu cpu)
 {
-       return perf_env__get_cache_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_cache_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 
 static struct aggr_cpu_id perf_stat__get_core_file(struct perf_stat_config *config __maybe_unused,
                                                   struct perf_cpu cpu)
 {
-       return perf_env__get_core_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_core_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 
 static struct aggr_cpu_id perf_stat__get_cpu_file(struct perf_stat_config *config __maybe_unused,
                                                  struct perf_cpu cpu)
 {
-       return perf_env__get_cpu_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_cpu_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 
 static struct aggr_cpu_id perf_stat__get_node_file(struct perf_stat_config *config __maybe_unused,
                                                   struct perf_cpu cpu)
 {
-       return perf_env__get_node_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_node_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 
 static struct aggr_cpu_id perf_stat__get_global_file(struct perf_stat_config *config __maybe_unused,
                                                     struct perf_cpu cpu)
 {
-       return perf_env__get_global_aggr_by_cpu(cpu, &perf_stat.session->header.env);
+       return perf_env__get_global_aggr_by_cpu(cpu, perf_session__env(perf_stat.session));
 }
 
 static aggr_cpu_id_get_t aggr_mode__get_aggr_file(enum aggr_mode aggr_mode)
 
 static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
 {
-       struct perf_env *env = &st->session->header.env;
+       struct perf_env *env = perf_session__env(st->session);
        aggr_cpu_id_get_t get_id = aggr_mode__get_aggr_file(stat_config.aggr_mode);
        bool needs_sort = stat_config.aggr_mode != AGGR_NONE;
 
 {
        struct perf_record_stat_round *stat_round = &event->stat_round;
        struct timespec tsh, *ts = NULL;
-       const char **argv = session->header.env.cmdline_argv;
-       int argc = session->header.env.nr_cmdline;
+       struct perf_env *env = perf_session__env(session);
+       const char **argv = env->cmdline_argv;
+       int argc = env->nr_cmdline;
 
        process_counters();
 
 
        if (IS_ERR(session))
                return PTR_ERR(session);
 
-       symbol__init(&session->header.env);
+       symbol__init(perf_session__env(session));
 
        (void)perf_header__process_sections(&session->header,
                                            perf_data__fd(session->data),
 
        }
 
        ret = evlist__tui_browse_hists(top->evlist, help, &hbt, top->min_percent,
-                                      &top->session->header.env, !top->record_opts.overwrite);
+                                      perf_session__env(top->session),
+                                      !top->record_opts.overwrite);
        if (ret == K_RELOAD) {
                top->zero = true;
                goto repeat;
        int ret;
 
        if (!annotate_opts.objdump_path) {
-               ret = perf_env__lookup_objdump(&top->session->header.env,
+               ret = perf_env__lookup_objdump(perf_session__env(top->session),
                                               &annotate_opts.objdump_path);
                if (ret)
                        return ret;
 
        if (trace->opts.target.tid)
                symbol_conf.tid_list_str = strdup(trace->opts.target.tid);
 
-       if (symbol__init(&session->header.env) < 0)
+       if (symbol__init(perf_session__env(session)) < 0)
                goto out;
 
        trace->host = &session->machines.host;
 
        int i;
        struct aggr_cpu_id id;
        struct perf_cpu cpu;
+       struct perf_env *env;
 
        session = perf_session__new(&data, NULL);
        TEST_ASSERT_VAL("can't get session", !IS_ERR(session));
+       env = perf_session__env(session);
        cpu__setup_cpunode_map();
 
        /* On platforms with large numbers of CPUs process_cpu_topology()
         *  condition is true (see do_core_id_test in header.c). So always
         *  run this test on those platforms.
         */
-       if (!session->header.env.cpu
-                       && strncmp(session->header.env.arch, "s390", 4)
-                       && strncmp(session->header.env.arch, "aarch64", 7))
+       if (!env->cpu && strncmp(env->arch, "s390", 4) && strncmp(env->arch, "aarch64", 7))
                return TEST_SKIP;
 
        /*
         * physical_package_id will be set to -1. Hence skip this
         * test if physical_package_id returns -1 for cpu from perf_cpu_map.
         */
-       if (!strncmp(session->header.env.arch, "ppc64le", 7)) {
+       if (!strncmp(env->arch, "ppc64le", 7)) {
                if (cpu__get_socket_id(perf_cpu_map__cpu(map, 0)) == -1)
                        return TEST_SKIP;
        }
 
-       TEST_ASSERT_VAL("Session header CPU map not set", session->header.env.cpu);
+       TEST_ASSERT_VAL("Session header CPU map not set", env->cpu);
 
-       for (i = 0; i < session->header.env.nr_cpus_avail; i++) {
+       for (i = 0; i < env->nr_cpus_avail; i++) {
                cpu.cpu = i;
                if (!perf_cpu_map__has(map, cpu))
                        continue;
                pr_debug("CPU %d, core %d, socket %d\n", i,
-                        session->header.env.cpu[i].core_id,
-                        session->header.env.cpu[i].socket_id);
+                        env->cpu[i].core_id,
+                        env->cpu[i].socket_id);
        }
 
        // Test that CPU ID contains socket, die, core and CPU
                                cpu.cpu == id.cpu.cpu);
 
                TEST_ASSERT_VAL("Cpu map - Core ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].core_id == id.core);
+                       env->cpu[cpu.cpu].core_id == id.core);
                TEST_ASSERT_VAL("Cpu map - Socket ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].socket_id ==
-                       id.socket);
+                       env->cpu[cpu.cpu].socket_id == id.socket);
 
                TEST_ASSERT_VAL("Cpu map - Die ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].die_id == id.die);
+                       env->cpu[cpu.cpu].die_id == id.die);
                TEST_ASSERT_VAL("Cpu map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Cpu map - Thread IDX is set", id.thread_idx == -1);
        }
        perf_cpu_map__for_each_cpu(cpu, i, map) {
                id = aggr_cpu_id__core(cpu, NULL);
                TEST_ASSERT_VAL("Core map - Core ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].core_id == id.core);
+                       env->cpu[cpu.cpu].core_id == id.core);
 
                TEST_ASSERT_VAL("Core map - Socket ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].socket_id ==
-                       id.socket);
+                       env->cpu[cpu.cpu].socket_id == id.socket);
 
                TEST_ASSERT_VAL("Core map - Die ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].die_id == id.die);
+                       env->cpu[cpu.cpu].die_id == id.die);
                TEST_ASSERT_VAL("Core map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Core map - Thread IDX is set", id.thread_idx == -1);
        }
        perf_cpu_map__for_each_cpu(cpu, i, map) {
                id = aggr_cpu_id__die(cpu, NULL);
                TEST_ASSERT_VAL("Die map - Socket ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].socket_id ==
-                       id.socket);
+                       env->cpu[cpu.cpu].socket_id == id.socket);
 
                TEST_ASSERT_VAL("Die map - Die ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].die_id == id.die);
+                       env->cpu[cpu.cpu].die_id == id.die);
 
                TEST_ASSERT_VAL("Die map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Die map - Core is set", id.core == -1);
        perf_cpu_map__for_each_cpu(cpu, i, map) {
                id = aggr_cpu_id__socket(cpu, NULL);
                TEST_ASSERT_VAL("Socket map - Socket ID doesn't match",
-                       session->header.env.cpu[cpu.cpu].socket_id ==
-                       id.socket);
+                       env->cpu[cpu.cpu].socket_id == id.socket);
 
                TEST_ASSERT_VAL("Socket map - Node ID is set", id.node == -1);
                TEST_ASSERT_VAL("Socket map - Die ID is set", id.die == -1);
 
         * for perf-record and perf-report use header.env;
         * otherwise, use global perf_env.
         */
-       env = session->data ? &session->header.env : &perf_env;
+       env = session->data ? perf_session__env(session) : &perf_env;
 
        arrays = 1UL << PERF_BPIL_JITED_KSYMS;
        arrays |= 1UL << PERF_BPIL_JITED_FUNC_LENS;
 
                "FAULT_DATA",
                "FAULT_INST",
 /*
- * TODO: This switch should happen on 'session->header.env.arch'
+ * TODO: This switch should happen on 'perf_session__env(session)->arch'
  * instead, because an arm64 platform perf recording could be
  * opened for analysis on other platforms as well.
  */
 
 static int setup_streams(struct ctf_writer *cw, struct perf_session *session)
 {
        struct ctf_stream **stream;
-       struct perf_header *ph = &session->header;
+       struct perf_env *env = perf_session__env(session);
        int ncpus;
 
        /*
         * Try to get the number of cpus used in the data file,
         * if not present fallback to the MAX_CPUS.
         */
-       ncpus = ph->env.nr_cpus_avail ?: MAX_CPUS;
+       ncpus = env->nr_cpus_avail ?: MAX_CPUS;
 
        stream = zalloc(sizeof(*stream) * ncpus);
        if (!stream) {
 static int ctf_writer__setup_env(struct ctf_writer *cw,
                                 struct perf_session *session)
 {
-       struct perf_header *header = &session->header;
+       struct perf_env *env = perf_session__env(session);
        struct bt_ctf_writer *writer = cw->writer;
 
 #define ADD(__n, __v)                                                  \
                return -1;                                              \
 } while (0)
 
-       ADD("host",    header->env.hostname);
+       ADD("host",    env->hostname);
        ADD("sysname", "Linux");
-       ADD("release", header->env.os_release);
-       ADD("version", header->env.version);
-       ADD("machine", header->env.arch);
+       ADD("release", env->os_release);
+       ADD("version", env->version);
+       ADD("machine", env->arch);
        ADD("domain", "kernel");
        ADD("tracer_name", "perf");
 
        int64_t offset = 0;
 
        if (tod) {
-               struct perf_env *env = &session->header.env;
+               struct perf_env *env = perf_session__env(session);
 
                if (!env->clock.enabled) {
                        pr_err("Can't provide --tod time, missing clock data. "
 
 static void output_headers(struct perf_session *session, struct convert_json *c)
 {
        struct stat st;
-       struct perf_header *header = &session->header;
+       const struct perf_header *header = &session->header;
+       const struct perf_env *env = perf_session__env(session);
        int ret;
        int fd = perf_data__fd(session->data);
        int i;
        output_json_key_format(out, true, 2, "data-size", "%" PRIu64, header->data_size);
        output_json_key_format(out, true, 2, "feat-offset", "%" PRIu64, header->feat_offset);
 
-       output_json_key_string(out, true, 2, "hostname", header->env.hostname);
-       output_json_key_string(out, true, 2, "os-release", header->env.os_release);
-       output_json_key_string(out, true, 2, "arch", header->env.arch);
+       output_json_key_string(out, true, 2, "hostname", env->hostname);
+       output_json_key_string(out, true, 2, "os-release", env->os_release);
+       output_json_key_string(out, true, 2, "arch", env->arch);
 
-       if (header->env.cpu_desc)
-               output_json_key_string(out, true, 2, "cpu-desc", header->env.cpu_desc);
+       if (env->cpu_desc)
+               output_json_key_string(out, true, 2, "cpu-desc", env->cpu_desc);
 
-       output_json_key_string(out, true, 2, "cpuid", header->env.cpuid);
-       output_json_key_format(out, true, 2, "nrcpus-online", "%u", header->env.nr_cpus_online);
-       output_json_key_format(out, true, 2, "nrcpus-avail", "%u", header->env.nr_cpus_avail);
+       output_json_key_string(out, true, 2, "cpuid", env->cpuid);
+       output_json_key_format(out, true, 2, "nrcpus-online", "%u", env->nr_cpus_online);
+       output_json_key_format(out, true, 2, "nrcpus-avail", "%u", env->nr_cpus_avail);
 
-       if (header->env.clock.enabled) {
+       if (env->clock.enabled) {
                output_json_key_format(out, true, 2, "clockid",
-                               "%u", header->env.clock.clockid);
+                               "%u", env->clock.clockid);
                output_json_key_format(out, true, 2, "clock-time",
-                               "%" PRIu64, header->env.clock.clockid_ns);
+                               "%" PRIu64, env->clock.clockid_ns);
                output_json_key_format(out, true, 2, "real-time",
-                               "%" PRIu64, header->env.clock.tod_ns);
+                               "%" PRIu64, env->clock.tod_ns);
        }
 
-       output_json_key_string(out, true, 2, "perf-version", header->env.version);
+       output_json_key_string(out, true, 2, "perf-version", env->version);
 
        output_json_key_format(out, true, 2, "cmdline", "[");
-       for (i = 0; i < header->env.nr_cmdline; i++) {
+       for (i = 0; i < env->nr_cmdline; i++) {
                output_json_delimiters(out, i != 0, 3);
-               output_json_string(c->out, header->env.cmdline_argv[i]);
+               output_json_string(c->out, env->cmdline_argv[i]);
        }
        output_json_format(out, false, 2, "]");
 }
                fprintf(stderr, "Error creating perf session!\n");
                goto err_fclose;
        }
-
-       if (symbol__init(&session->header.env) < 0) {
+       if (symbol__init(perf_session__env(session)) < 0) {
                fprintf(stderr, "Symbol init error!\n");
                goto err_session_delete;
        }
 
 {
        int i, err = -1;
        struct perf_cpu_map *map;
-       int nr_cpus = min(session->header.env.nr_cpus_avail, MAX_NR_CPUS);
+       int nr_cpus = min(perf_session__env(session)->nr_cpus_avail, MAX_NR_CPUS);
        struct perf_cpu cpu;
 
        for (i = 0; i < PERF_TYPE_MAX; ++i) {
 
        return 0;
 }
+
+struct perf_env *perf_session__env(struct perf_session *session)
+{
+       return &session->header.env;
+}
 
                                       union perf_event *event,
                                       struct ordered_events *oe);
 
+struct perf_env *perf_session__env(struct perf_session *session);
+
 #endif /* __PERF_SESSION_H */
 
        void *src;
        size_t decomp_size, src_size;
        u64 decomp_last_rem = 0;
-       size_t mmap_len, decomp_len = session->header.env.comp_mmap_len;
+       size_t mmap_len, decomp_len = perf_session__env(session)->comp_mmap_len;
        struct decomp *decomp, *decomp_last = session->active_decomp->decomp_last;
 
        if (decomp_last) {