str_off
__u32 str_off;
unsigned long str_off;
str_off = 0;
for (str_off = 0; str_off < str_len; ++str_off) {
if (str[str_off] != *(p_rom + start + str_off))
if (str_off == str_len || str[str_off] == 0)
#define early_param_on_off(str_on, str_off, var, config) \
early_param(str_off, parse_##var##_off)
__u32 str_off; /* offset of string section */
__btf_verifier_log(log, "str_off: %u\n", hdr->str_off);
start = btf->nohdr_data + hdr->str_off;
offsetof(struct btf_header, str_off),
__u32 str_off; /* offset of string section */
btf->strs_data = btf->raw_data + btf->hdr->hdr_len + btf->hdr->str_off;
btf->hdr->str_off += data_sz;
static int btf_rewrite_str(struct btf_pipe *p, __u32 *str_off)
if (!*str_off) /* nothing to do for empty strings */
hashmap__find(p->str_off_map, *str_off, &mapped_off)) {
*str_off = mapped_off;
off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off));
err = hashmap__append(p->str_off_map, *str_off, off);
*str_off = off;
__u32 *str_off;
while ((str_off = btf_field_iter_next(&it))) {
err = btf_rewrite_str(p, str_off);
__u32 *type_id, *str_off;
while ((str_off = btf_field_iter_next(&it))) {
err = btf_rewrite_str(&p, str_off);
btf->hdr->str_off += data_sz;
h->str_off = bswap_32(h->str_off);
btf->hdr->str_off += sz;
btf->hdr->str_off += sz;
if (meta_left < (long long)hdr->str_off + hdr->str_len) {
btf->hdr->str_off += sz;
if ((long long)hdr->type_off + hdr->type_len > hdr->str_off) {
hdr->type_off, hdr->type_len, hdr->str_off, hdr->str_len);
btf->hdr->str_off += sz;
btf->hdr->str_off += sz;
__u32 *str_off;
while ((str_off = btf_field_iter_next(&it))) {
r = fn(str_off, ctx);
__u32 str_off = *str_off_ptr;
if (str_off == 0 || str_off < d->btf->start_str_off)
s = btf__str_by_offset(d->btf, str_off);
static int btf_validate_str(const struct btf *btf, __u32 str_off, const char *what, __u32 type_id)
s = btf__str_by_offset(btf, str_off);
pr_warn("btf: type [%u]: invalid %s (string offset %u)\n", type_id, what, str_off);
d->btf->hdr->str_off = d->btf->hdr->type_len;
__u32 *str_off;
while ((str_off = btf_field_iter_next(&it))) {
if (!*str_off)
if (*str_off >= r->dist_str_len) {
*str_off += r->base_str_len - r->dist_str_len;
off = r->str_map[*str_off];
btf__str_by_offset(r->btf, off), *str_off);
*str_off = off;
typedef int (*str_off_visit_fn)(__u32 *str_off, void *ctx);
.str_off = types_len,
static int check_btf_str_off(__u32 *str_off, void *ctx)
s = btf__str_by_offset(btf, *str_off);
__u32 *type_id, *str_off;
while ((str_off = btf_field_iter_next(&it))) {
if (!btf__str_by_offset(obj->btf, *str_off))
int rec_sz, str_off, i;
str_off = btf__add_str(linker->btf, s);
if (str_off < 0)
dst_rec->file_name_off = str_off;
str_off = btf__add_str(linker->btf, s);
if (str_off < 0)
dst_rec->line_off = str_off;
str_off = btf__add_str(linker->btf, s);
if (str_off < 0)
dst_rec->access_str_off = str_off;
int str_off;
str_off = btf__add_str(linker->btf, sec_name);
if (str_off < 0)
sec_info->sec_name_off = str_off;
int err, str_off;
str_off = strset__add_str(linker->strtab_strs, sec->sec_name);
if (str_off < 0)
return str_off;
sec->shdr->sh_name = str_off;
str_off = strset__add_str(linker->strtab_strs, sec->sec_name);
if (str_off < 0)
return str_off;
sec->shdr->sh_name = str_off;
.str_off = sizeof(btf_raw_types),
ret_hdr->str_off = type_sec_size;
hdr->str_off = (int)hdr->str_off + test->str_off_delta;
const char *str, __u32 str_off,
const char *next_str = str + str_off;
test_strs = test_btf_data + sizeof(*test_hdr) + test_hdr->str_off;
expect_strs = expect_btf_data + sizeof(*test_hdr) + expect_hdr->str_off;
int str_off, err;
str_off = btf__find_str(btf2, "int");
ASSERT_NEQ(str_off, -ENOENT, "str_int_missing");
int str_off, i, err;
str_off = btf__find_str(btf2, "int");
ASSERT_NEQ(str_off, -ENOENT, "str_int_missing");
int id, err, str_off;
str_off = btf__find_str(btf, "int");
ASSERT_EQ(str_off, -ENOENT, "int_str_missing_off");
str_off = btf__add_str(btf, "int");
ASSERT_EQ(str_off, 1, "int_str_off");
str_off = btf__find_str(btf, "int");
ASSERT_EQ(str_off, 1, "int_str_found_off");
ASSERT_EQ(t->name_off, str_off, "int_name_off");
.str_off = offsetof(struct test_btf, strings) -
.str_off = offsetof(struct btf_blob, str) - offsetof(struct btf_blob, types),
.str_off = offsetof(struct btf_blob, str) - offsetof(struct btf_blob, types),
.str_off = types_len,
test_statmount_string(STATMOUNT_MNT_ROOT, str_off(mnt_root), "mount root");
test_statmount_string(STATMOUNT_MNT_POINT, str_off(mnt_point), "mount point");
test_statmount_string(STATMOUNT_FS_TYPE, str_off(fs_type), "fs type");
test_statmount_string(all_mask, str_off(mnt_root), "mount root & all");
test_statmount_string(all_mask, str_off(mnt_point), "mount point & all");
test_statmount_string(all_mask, str_off(fs_type), "fs type & all");