Index | Thread | Search

From:
Mark Kettenis <mark.kettenis@xs4all.nl>
Subject:
Re: missing endbr64
To:
Theo Buehler <tb@theobuehler.org>
Cc:
ports@openbsd.org
Date:
Sun, 25 Feb 2024 16:44:03 +0100

Download raw body.

Thread
> From: Theo Buehler <tb () theobuehler ! org>
> 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