PERF_OUTPUT_VCPU            = 1ULL << 38,
        PERF_OUTPUT_CGROUP          = 1ULL << 39,
        PERF_OUTPUT_RETIRE_LAT      = 1ULL << 40,
+       PERF_OUTPUT_DSOFF           = 1ULL << 41,
 };
 
 struct perf_script {
        {.str = "ip",    .field = PERF_OUTPUT_IP},
        {.str = "sym",   .field = PERF_OUTPUT_SYM},
        {.str = "dso",   .field = PERF_OUTPUT_DSO},
+       {.str = "dsoff", .field = PERF_OUTPUT_DSOFF},
        {.str = "addr",  .field = PERF_OUTPUT_ADDR},
        {.str = "symoff", .field = PERF_OUTPUT_SYMOFFSET},
        {.str = "srcline", .field = PERF_OUTPUT_SRCLINE},
        if (PRINT_FIELD(DSO))
                output[type].print_ip_opts |= EVSEL__PRINT_DSO;
 
+       if (PRINT_FIELD(DSOFF))
+               output[type].print_ip_opts |= EVSEL__PRINT_DSOFF;
+
        if (PRINT_FIELD(SYMOFFSET))
                output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET;
 
                if (evsel == NULL)
                        continue;
 
+               /* 'dsoff' implys 'dso' field */
+               if (output[j].fields & PERF_OUTPUT_DSOFF)
+                       output[j].fields |= PERF_OUTPUT_DSO;
+
                set_print_ip_opts(&evsel->core.attr);
                tod |= output[j].fields & PERF_OUTPUT_TOD;
        }
                }
 
                printed += fprintf(fp, " 0x%"PRIx64, from);
-               if (PRINT_FIELD(DSO)) {
-                       printed += fprintf(fp, "(");
-                       printed += map__fprintf_dsoname(alf.map, fp);
-                       printed += fprintf(fp, ")");
-               }
+               if (PRINT_FIELD(DSO))
+                       printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp);
 
                printed += fprintf(fp, "/0x%"PRIx64, to);
-               if (PRINT_FIELD(DSO)) {
-                       printed += fprintf(fp, "(");
-                       printed += map__fprintf_dsoname(alt.map, fp);
-                       printed += fprintf(fp, ")");
-               }
+               if (PRINT_FIELD(DSO))
+                       printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp);
 
                printed += print_bstack_flags(fp, entries + i);
        }
                thread__find_symbol_fb(thread, sample->cpumode, to, &alt);
 
                printed += symbol__fprintf_symname_offs(alf.sym, &alf, fp);
-               if (PRINT_FIELD(DSO)) {
-                       printed += fprintf(fp, "(");
-                       printed += map__fprintf_dsoname(alf.map, fp);
-                       printed += fprintf(fp, ")");
-               }
+               if (PRINT_FIELD(DSO))
+                       printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp);
                printed += fprintf(fp, "%c", '/');
                printed += symbol__fprintf_symname_offs(alt.sym, &alt, fp);
-               if (PRINT_FIELD(DSO)) {
-                       printed += fprintf(fp, "(");
-                       printed += map__fprintf_dsoname(alt.map, fp);
-                       printed += fprintf(fp, ")");
-               }
+               if (PRINT_FIELD(DSO))
+                       printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp);
                printed += print_bstack_flags(fp, entries + i);
        }
 
                        to = map__dso_map_ip(alt.map, to);
 
                printed += fprintf(fp, " 0x%"PRIx64, from);
-               if (PRINT_FIELD(DSO)) {
-                       printed += fprintf(fp, "(");
-                       printed += map__fprintf_dsoname(alf.map, fp);
-                       printed += fprintf(fp, ")");
-               }
+               if (PRINT_FIELD(DSO))
+                       printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp);
                printed += fprintf(fp, "/0x%"PRIx64, to);
-               if (PRINT_FIELD(DSO)) {
-                       printed += fprintf(fp, "(");
-                       printed += map__fprintf_dsoname(alt.map, fp);
-                       printed += fprintf(fp, ")");
-               }
+               if (PRINT_FIELD(DSO))
+                       printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp);
                printed += print_bstack_flags(fp, entries + i);
        }
 
                        printed += symbol__fprintf_symname(al.sym, fp);
        }
 
-       if (PRINT_FIELD(DSO)) {
-               printed += fprintf(fp, " (");
-               printed += map__fprintf_dsoname(al.map, fp);
-               printed += fprintf(fp, ")");
-       }
+       if (PRINT_FIELD(DSO))
+               printed += map__fprintf_dsoname_dsoff(al.map, PRINT_FIELD(DSOFF), al.addr, fp);
 out:
        return printed;
 }
                     "comma separated output fields prepend with 'type:'. "
                     "+field to add and -field to remove."
                     "Valid types: hw,sw,trace,raw,synth. "
-                    "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
+                    "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff"
                     "addr,symoff,srcline,period,iregs,uregs,brstack,"
                     "brstacksym,flags,data_src,weight,bpf-output,brstackinsn,"
                     "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth,"
 
        int print_ip = print_opts & EVSEL__PRINT_IP;
        int print_sym = print_opts & EVSEL__PRINT_SYM;
        int print_dso = print_opts & EVSEL__PRINT_DSO;
+       int print_dsoff = print_opts & EVSEL__PRINT_DSOFF;
        int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET;
        int print_oneline = print_opts & EVSEL__PRINT_ONELINE;
        int print_srcline = print_opts & EVSEL__PRINT_SRCLINE;
                                }
                        }
 
-                       if (print_dso && (!sym || !sym->inlined)) {
-                               printed += fprintf(fp, " (");
-                               printed += map__fprintf_dsoname(map, fp);
-                               printed += fprintf(fp, ")");
-                       }
+                       if (print_dso && (!sym || !sym->inlined))
+                               printed += map__fprintf_dsoname_dsoff(map, print_dsoff, addr, fp);
 
                        if (print_srcline)
                                printed += map__fprintf_srcline(map, addr, "\n  ", fp);
        int print_ip = print_opts & EVSEL__PRINT_IP;
        int print_sym = print_opts & EVSEL__PRINT_SYM;
        int print_dso = print_opts & EVSEL__PRINT_DSO;
+       int print_dsoff = print_opts & EVSEL__PRINT_DSOFF;
        int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET;
        int print_srcline = print_opts & EVSEL__PRINT_SRCLINE;
        int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR;
                        }
                }
 
-               if (print_dso) {
-                       printed += fprintf(fp, " (");
-                       printed += map__fprintf_dsoname(al->map, fp);
-                       printed += fprintf(fp, ")");
-               }
+               if (print_dso)
+                       printed += map__fprintf_dsoname_dsoff(al->map, print_dsoff, al->addr, fp);
 
                if (print_srcline)
                        printed += map__fprintf_srcline(al->map, al->addr, "\n  ", fp);