From: Mark Kettenis Subject: Re: missing endbr64 To: Theo Buehler Cc: ports@openbsd.org Date: Sun, 25 Feb 2024 16:44:03 +0100 > From: Theo Buehler > Date: Sun, 25 Feb 2024 09:39:39 +0000 > > Here's the list of ~90 ports emitting warnings after about 1/4 of an > amd64 bulk. First the ports that I haven't looked at more closely with > (some of) the warnings. Then some ports using D where I suspect NOBTCFI > is missing. Go, Haskell and Ocaml ports are linked using nobtcfi, as far > as I know, so I moved them to the end without details. > > devel/ffcall.log > ld: warning: __vacall_r: missing endbr64 This one is deliberately not addressed; see my commit to that port. > devel/valgrind.log > ld: warning: __start: missing endbr64 Not a problem on OpenBSD. This is the entry point of a static executable and our kernel doesn't use an indirect jump to get to the entry point. > lang/gcc/11,-ada.log > lang/gcc/8.log: > ld.lld: warning: pow2_or_zerop(unsigned long long): missing endbr64 > ld.lld: warning: pow2p_hwi(unsigned long long): missing endbr64 > ld.lld: warning: types_compatible_p(tree_node*, tree_node*): missing endbr64 > ld.lld: warning: vn_hash_type(tree_node*): missing endbr64 > ld.lld: warning: vn_hash_constant_with_type(tree_node*): missing endbr64 > ld.lld: warning: vn_constant_eq_with_type(tree_node*, tree_node*): missing endbr64 > ld.lld: warning: vn_constant_eq_with_type(tree_node*, tree_node*): missing endbr64 > ld.lld: warning: iterative_hash_expr(tree_node const*, unsigned int): missing endbr64 > and tons more I don't think these are from assembly code. Investigating. > lang/gprolog.log > ld.lld: warning: predicate(pl2wam1/1): missing endbr64 > ld.lld: warning: predicate(pl2wam1/1): missing endbr64 > ld.lld: warning: predicate(compile_msg_start/2): missing endbr64 > ld.lld: warning: predicate(cmd_line_args/3): missing endbr64 > ld.lld: warning: predicate(cmd_line_arg1/3): missing endbr64 > ld.lld: warning: predicate(cmd_line_arg1/3): missing endbr64 > ld.lld: warning: predicate(cmd_line_arg1/3): missing endbr64 > ld.lld: warning: predicate(cmd_line_arg1/3): missing endbr64 > ld.lld: warning: predicate(cmd_line_arg1/3): missing endbr64 > ld.lld: warning: directive_1: missing endbr64 > ld.lld: warning: Prolog_Object_Initializer: missing endbr64 > ld.lld: warning: System_Directives: missing endbr64 > ld.lld: warning: User_Directives: missing endbr64 Is this a compiler? Either needs to be modified to emit endbr64 then or some NOBTCFI. > lang/hare/hare.log > ld: warning: preinit_hare: missing endbr64 > ld: warning: encoding.utf8.prev: missing endbr64 > ld: warning: encoding.utf8.next: missing endbr64 > ld: warning: sort.cmp.strs: missing endbr64 > ld: warning: endian.leputu64: missing endbr64 > ld: warning: endian.legetu64: missing endbr64 > ld: warning: endian.leputu32: missing endbr64 > ld: warning: endian.legetu32: missing endbr64 > ld: warning: endian.leputu16: missing endbr64 > ld: warning: endian.legetu16: missing endbr64 > ld: warning: endian.beputu64: missing endbr64 > ld: warning: endian.begetu64: missing endbr64 > ld: warning: endian.beputu32: missing endbr64 > ld: warning: endian.begetu32: missing endbr64 > ld: warning: endian.beputu16: missing endbr64 > ld: warning: endian.begetu16: missing endbr64 > ld: warning: hare.unparse.syn_nowrap: missing endbr64 Same story. > lang/luajit.log > ld.lld: warning: lj_vm_unwind_c_eh: missing endbr64 > ld.lld: warning: lj_vm_unwind_rethrow: missing endbr64 > ld.lld: warning: lj_vm_unwind_ff_eh: missing endbr64 > ld.lld: warning: lj_cont_cat: missing endbr64 > ld.lld: warning: lj_cont_ra: missing endbr64 > ld.lld: warning: lj_cont_nop: missing endbr64 > ld.lld: warning: lj_cont_condt: missing endbr64 > etc Looks like the assembly code is generated from some lua code. Needs someone who actually understands lua. > mail/rspamd.log > ld.lld: warning: chacha_blocks_avx2: missing endbr64 > ld.lld: warning: _chacha_blocks_avx2: missing endbr64 > ld.lld: warning: hchacha_avx2: missing endbr64 > ld.lld: warning: _hchacha_avx2: missing endbr64 > ld.lld: warning: chacha_avx2: missing endbr64 > ld.lld: warning: _chacha_avx2: missing endbr64 > ld.lld: warning: xchacha_avx2: missing endbr64 > ld.lld: warning: _xchacha_avx2: missing endbr64 > ld.lld: warning: chacha_blocks_avx: missing endbr64 > ld.lld: warning: _chacha_blocks_avx: missing endbr64 > ld.lld: warning: hchacha_avx: missing endbr64 > ld.lld: warning: _hchacha_avx: missing endbr64 > ld.lld: warning: chacha_avx: missing endbr64 > ld.lld: warning: _chacha_avx: missing endbr64 > ld.lld: warning: xchacha_avx: missing endbr64 > ld.lld: warning: _xchacha_avx: missing endbr64 > ld.lld: warning: chacha_blocks_sse2: missing endbr64 > ld.lld: warning: _chacha_blocks_sse2: missing endbr64 > ld.lld: warning: hchacha_sse2: missing endbr64 > ld.lld: warning: _hchacha_sse2: missing endbr64 > ld.lld: warning: chacha_sse2: missing endbr64 > ld.lld: warning: _chacha_sse2: missing endbr64 > ld.lld: warning: xchacha_sse2: missing endbr64 > ld.lld: warning: _xchacha_sse2: missing endbr64 > > math/ecm.log > ld: warning: mulredc1: missing endbr64 > ld: warning: mulredc2: missing endbr64 > ld: warning: mulredc3: missing endbr64 > ld: warning: mulredc4: missing endbr64 > ld: warning: mulredc5: missing endbr64 > etc > > multimedia/aom.log > ld: warning: aom_highbd_dc_predictor_4x4_sse2: missing endbr64 > ld: warning: aom_highbd_dc_predictor_8x8_sse2: missing endbr64 > ld: warning: aom_highbd_dc_predictor_16x16_sse2: missing endbr64 > ld: warning: aom_highbd_dc_predictor_32x32_sse2: missing endbr64 > ld: warning: aom_highbd_v_predictor_4x4_sse2: missing endbr64 > ld: warning: aom_highbd_v_predictor_8x8_sse2: missing endbr64 > ld: warning: aom_highbd_v_predictor_16x16_sse2: missing endbr64 > ld: warning: aom_highbd_v_predictor_32x32_sse2: missing endbr64 > ld: warning: aom_dc_predictor_4x4_sse2: missing endbr64 > ld: warning: aom_dc_left_predictor_4x4_sse2: missing endbr64 > ld: warning: aom_dc_top_predictor_4x4_sse2: missing endbr64 > etc I think this is a copy of the conde in multimedia/dav1d. Probably an older version but the dav1d patches can serve as inspiration. > multimedia/libass.log > ld: warning: ass_fill_solid_tile16_sse2: missing endbr64 > ld: warning: ass_fill_solid_tile16_avx2: missing endbr64 > ld: warning: ass_fill_halfplane_tile16_sse2: missing endbr64 > ld: warning: ass_fill_halfplane_tile16_avx2: missing endbr64 > ld: warning: ass_fill_generic_tile16_sse2: missing endbr64 > ld: warning: ass_fill_generic_tile16_avx2: missing endbr64 > ld: warning: ass_merge_tile16_sse2: missing endbr64 > ld: warning: ass_merge_tile16_avx2: missing endbr64 > ld: warning: ass_add_bitmaps_sse2: missing endbr64 > etc Has an x86inc.asm file. So picking up the x86inc.asm from multimedia/x264 will probably work. > multimedia/libdv.log > ld: warning: dv_decode_vlc: missing endbr64 > ld: warning: __dv_decode_vlc: missing endbr64 > ld: warning: dv_parse_ac_coeffs_pass0: missing endbr64 > ld: warning: dv_parse_video_segment: missing endbr64 No convenient macros. Adding endbr64 at the start of just those functions is probably the best approach. > multimedia/svt-av1.log: seems to embed a copy of multimedia/aom > ld: warning: svt_aom_dc_predictor_4x4_sse2: missing endbr64 > ld: warning: svt_aom_dc_left_predictor_4x4_sse2: missing endbr64 > ld: warning: svt_aom_dc_top_predictor_4x4_sse2: missing endbr64 > ld: warning: svt_aom_dc_predictor_8x8_sse2: missing endbr64 > ld: warning: svt_aom_dc_top_predictor_8x8_sse2: missing endbr64 > etc Seems to include a copy of multimedia/aom. > multimedia/x264.log > ld: warning: x264_8_sub8x8_dct_sse2.skip_prologue: missing endbr64 > ld: warning: x264_8_sub8x8_dct8_sse2.skip_prologue: missing endbr64 > ld: warning: x264_8_sub8x8_dct_ssse3.skip_prologue: missing endbr64 > ld: warning: x264_8_sub8x8_dct8_ssse3.skip_prologue: missing endbr64 > ld: warning: x264_8_sub8x8_dct_avx.skip_prologue: missing endbr64 > ld: warning: x264_8_sub8x8_dct8_avx.skip_prologue: missing endbr64 > ld: warning: x264_8_sub8x8_dct_xop.skip_prologue: missing endbr64 > ld: warning: x264_8_add8x8_idct8_sse2.skip_prologue: missing endbr64 > ld: warning: x264_8_add8x8_idct8_avx.skip_prologue: missing endbr64 > ld: warning: x264_8_add8x8_idct_sse2.skip_prologue: missing endbr64 > ld: warning: x264_8_add8x8_idct_avx.skip_prologue: missing endbr64 > ld: warning: x264_10_sub8x8_dct8_sse2.skip_prologue: missing endbr64 > ld: warning: x264_10_sub8x8_dct8_sse4.skip_prologue: missing endbr64 > ld: warning: x264_10_sub8x8_dct8_avx.skip_prologue: missing endbr64 > ld: warning: x264_10_add8x8_idct8_sse2.skip_prologue: missing endbr64 > ld: warning: x264_10_add8x8_idct8_avx.skip_prologue: missing endbr64 Fixed. > sysutils/borgbackup/2.0.log: lots of warnings about symbols from openssl/3.1: > ld: warning: aesni_set_decrypt_key: missing endbr64 > ld: warning: aesni_set_encrypt_key: missing endbr64 > ld: warning: ChaCha20_ctr32: missing endbr64 > ld: warning: bn_mul_mont: missing endbr64 > ld: warning: bn_mul_mont_gather5: missing endbr64 > ld: warning: bn_power5: missing endbr64 > ld: warning: bn_get_bits5: missing endbr64 > ld: warning: bn_scatter5: missing endbr64 > ld: warning: bn_gather5: missing endbr64 > ld: warning: rsaz_1024_sqr_avx2: missing endbr64 > ld: warning: rsaz_1024_mul_avx2: missing endbr64 > etc WTF, so this links against the static version of the lib in order to be able to call non-public functions? USE_NOBTCFI and laugh at them? > x11/gnustep/libobjc2.log > ld: warning: __objc_block_trampoline_sret: missing endbr64 > ld: warning: __objc_block_trampoline: missing endbr64 > ld: warning: objc_msgSend: missing endbr64 > ld: warning: objc_msgSend_fpret: missing endbr64 > ld: warning: objc_msgSend_stret: missing endbr64 I guess this is very similay to devel/objfw. Just add endbr64 to those functions like we did there. No aarch64 support here by the looks of it. > devel/objfw.log: already fixed