@ -432,6 +432,19 @@ impl Btf {
// Sanitize DATASEC if they are not supported
// Sanitize DATASEC if they are not supported
BtfType ::DataSec ( d ) if ! features . btf_datasec = > {
BtfType ::DataSec ( d ) if ! features . btf_datasec = > {
debug ! ( "{}: not supported. replacing with STRUCT" , kind ) ;
debug ! ( "{}: not supported. replacing with STRUCT" , kind ) ;
// STRUCT aren't allowed to have "." in their name, fixup this if needed.
let mut name_offset = t . name_offset ( ) ;
let sec_name = self . string_at ( name_offset ) ? ;
let name = sec_name . to_string ( ) ;
// Handle any "." characters in struct names
// Example: ".maps"
let fixed_name = name . replace ( '.' , "_" ) ;
if fixed_name ! = name {
name_offset = self . add_string ( fixed_name ) ;
}
let mut members = vec! [ ] ;
let mut members = vec! [ ] ;
for member in d . entries . iter ( ) {
for member in d . entries . iter ( ) {
let mt = types . type_by_id ( member . btf_type ) . unwrap ( ) ;
let mt = types . type_by_id ( member . btf_type ) . unwrap ( ) ;
@ -441,7 +454,9 @@ impl Btf {
offset : member . offset * 8 ,
offset : member . offset * 8 ,
} )
} )
}
}
types . types [ i ] = BtfType ::Struct ( Struct ::new ( t . name_offset ( ) , members , 0 ) ) ;
types . types [ i ] =
BtfType ::Struct ( Struct ::new ( name_offset , members , d . entries . len ( ) as u32 ) ) ;
}
}
// Fixup DATASEC
// Fixup DATASEC
// DATASEC sizes aren't always set by LLVM
// DATASEC sizes aren't always set by LLVM
@ -1116,7 +1131,7 @@ mod tests {
VarLinkage ::Static ,
VarLinkage ::Static ,
) ) ) ;
) ) ) ;
let name_offset = btf . add_string ( " . data". to_string ( ) ) ;
let name_offset = btf . add_string ( " data". to_string ( ) ) ;
let variables = vec! [ DataSecEntry {
let variables = vec! [ DataSecEntry {
btf_type : var_type_id ,
btf_type : var_type_id ,
offset : 0 ,
offset : 0 ,