tools/objtool/disas.c
Source file repositories/reference/linux-study-clean/tools/objtool/disas.c
File Facts
- System
- Linux kernel
- Corpus path
tools/objtool/disas.c- Extension
.c- Size
- 29078 bytes
- Lines
- 1249
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
fnmatch.hobjtool/arch.hobjtool/check.hobjtool/disas.hobjtool/special.hobjtool/warn.hbfd.hlinux/string.htools/dis-asm-compat.h
Detected Declarations
struct disas_contextstruct disas_altfunction alt_featurefunction alt_flagsfunction asprintffunction sprint_namefunction disas_result_fprintffunction disas_fprintffunction init_disassemble_info_compatfunction disas_print_addr_symfunction disas_print_addr_altfunction disas_print_addr_norelocfunction disas_print_addr_relocfunction namefunction disas_print_addressfunction disas_info_initfunction disas_context_destroyfunction disas_vprintfunction disas_printfunction disas_print_infofunction addressfunction alternativefunction disas_insnfunction disas_insn_altfunction disas_alt_initfunction disas_alt_add_insnfunction disas_alt_jumpfunction disas_alt_extablefunction disas_alt_groupfunction alt_for_each_insnfunction disas_alt_defaultfunction disas_alt_print_insnfunction disas_alt_print_widefunction disas_alt_print_compactfunction disas_alt_trim_nopsfunction coversfunction disas_funcfunction disas_warned_funcsfunction for_each_symfunction disas_funcsfunction for_each_secfunction sec_for_each_sym
Annotated Snippet
struct disas_context {
struct objtool_file *file;
struct instruction *insn;
bool alt_applied;
char result[DISAS_RESULT_SIZE];
disassembler_ftype disassembler;
struct disassemble_info info;
};
/*
* Maximum number of alternatives
*/
#define DISAS_ALT_MAX 5
/*
* Maximum number of instructions per alternative
*/
#define DISAS_ALT_INSN_MAX 50
/*
* Information to disassemble an alternative
*/
struct disas_alt {
struct instruction *orig_insn; /* original instruction */
struct alternative *alt; /* alternative or NULL if default code */
char *name; /* name for this alternative */
int width; /* formatting width */
struct {
char *str; /* instruction string */
int offset; /* instruction offset */
int nops; /* number of nops */
} insn[DISAS_ALT_INSN_MAX]; /* alternative instructions */
int insn_idx; /* index of the next instruction to print */
};
#define DALT_DEFAULT(dalt) (!(dalt)->alt)
#define DALT_INSN(dalt) (DALT_DEFAULT(dalt) ? (dalt)->orig_insn : (dalt)->alt->insn)
#define DALT_GROUP(dalt) (DALT_INSN(dalt)->alt_group)
#define DALT_ALTID(dalt) ((dalt)->orig_insn->offset)
#define ALT_FLAGS_SHIFT 16
#define ALT_FLAG_NOT (1 << 0)
#define ALT_FLAG_DIRECT_CALL (1 << 1)
#define ALT_FEATURE_MASK ((1 << ALT_FLAGS_SHIFT) - 1)
static int alt_feature(unsigned int ft_flags)
{
return (ft_flags & ALT_FEATURE_MASK);
}
static int alt_flags(unsigned int ft_flags)
{
return (ft_flags >> ALT_FLAGS_SHIFT);
}
/*
* Wrapper around asprintf() to allocate and format a string.
* Return the allocated string or NULL on error.
*/
static char *strfmt(const char *fmt, ...)
{
va_list ap;
char *str;
int rv;
va_start(ap, fmt);
rv = vasprintf(&str, fmt, ap);
va_end(ap);
return rv == -1 ? NULL : str;
}
static int sprint_name(char *str, const char *name, unsigned long offset)
{
int len;
if (offset)
len = sprintf(str, "%s+0x%lx", name, offset);
else
len = sprintf(str, "%s", name);
return len;
}
#define DINFO_FPRINTF(dinfo, ...) \
((*(dinfo)->fprintf_func)((dinfo)->stream, __VA_ARGS__))
#define bfd_vma_fmt \
__builtin_choose_expr(sizeof(bfd_vma) == sizeof(unsigned long), "%#lx <%s>", "%#llx <%s>")
static int disas_result_fprintf(struct disas_context *dctx,
Annotation
- Immediate include surface: `fnmatch.h`, `objtool/arch.h`, `objtool/check.h`, `objtool/disas.h`, `objtool/special.h`, `objtool/warn.h`, `bfd.h`, `linux/string.h`.
- Detected declarations: `struct disas_context`, `struct disas_alt`, `function alt_feature`, `function alt_flags`, `function asprintf`, `function sprint_name`, `function disas_result_fprintf`, `function disas_fprintf`, `function init_disassemble_info_compat`, `function disas_print_addr_sym`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.