Date: Mon, 06 Jun 2022 03:44:32 +0800 From: "Michael Yan Ka Chiu" <nyan@myuji.xyz> To: "Konstantin Belousov" <kostikbel@gmail.com> Cc: freebsd-hackers@freebsd.org Subject: Re: Help needed to get Rust dtrace USDT working on/with FreeBSD linker Message-ID: <51c74c5b-731a-445f-be96-0baf6cd0ebe2@www.fastmail.com> In-Reply-To: <Ypz9gaGQ/Nqja5kF@kib.kiev.ua> References: <f5c27ce0-0dc7-467f-b293-857c74125648@www.fastmail.com> <Ypz9gaGQ/Nqja5kF@kib.kiev.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
--10660d8e775940ae9e59aa67b16a4e69 Content-Type: text/plain;charset=utf-8 Content-Transfer-Encoding: quoted-printable On Mon, Jun 6, 2022, at 3:01 AM, Konstantin Belousov wrote: > On Sun, Jun 05, 2022 at 04:26:37PM +0800, Michael Yan Ka Chiu wrote: > > Hi everyone, > >=20 > > I=E2=80=99m working on a PR to get the Rust Usdt crate working on Fr= eeBSD. This crate > > basically allow adding DTrace probes to rust sources by compiling th= e probe during > > macro invocation and embed to a custom section (set_dtrace_probe) us= ing inline=20 > > assembly. > >=20 > > The problem I am encountering is that the linker will optimize the c= ompiled probes > > out in the custom section, the only workaround I have found is to fo= rce the linker to > > link all the dead code by invoking `-C link-dead-code=3Dyes`. On Ill= umos, the workaround > > is to reference another section such that the Illumos linker will no= t throw the probes=20 > > away; however the same workaround does not work on FreeBSD. > >=20 > > I wonder if there're any tricks similar to the Illumos fix, by putti= ng some inline asm there > > to trick the linker and not throw out the probes. > >=20 > > Thanks In advance, > > Michael > >=20 > > References: > > The PR: https://github.com/oxidecomputer/usdt/pull/63 > > The illumos fix: https://github.com/oxidecomputer/usdt/blob/eac0fe5f= 03c3fbf23468ead5cb140f62d51ac3f3/usdt-impl/src/record.rs#L251 > >=20 > > =20 >=20 > GNU as seems to gain support for the "R" flag for sections, which shou= ld > prevent them from linker GC. Not sure if llvm toolchain has this, it > requires both as and lld to recognize the flag. >=20 > Anyway, try it? See GNU as documentation for the .section directive, > ELF type flags. Thanks! This seems to solve a big part of the issue. If i pass =E2=80=9Ccargo:rustc-link-arg=3D-Xlinker=E2=80=9D and =E2=80=9C= cargo:rustc-link-arg=3D=E2=80=94no-gc-sections=E2=80=9D it does prevent = the linker from removing the probes. I am still looking for solutions that does not involve explicit involvem= ent of the flags by the crate consumer, and maybe something not turning = gc off entirely but this is a great progress. --10660d8e775940ae9e59aa67b16a4e69 Content-Type: text/html;charset=utf-8 Content-Transfer-Encoding: quoted-printable <!DOCTYPE html><html><head><title></title><style type=3D"text/css">p.Mso= Normal,p.MsoNoSpacing{margin:0}</style></head><body><div>On Mon, Jun 6, = 2022, at 3:01 AM, Konstantin Belousov wrote:<br></div><blockquote type=3D= "cite" id=3D"qt" style=3D""><div>On Sun, Jun 05, 2022 at 04:26:37PM +080= 0, Michael Yan Ka Chiu wrote:<br></div><div>> Hi everyone,<br></div><= div>> <br></div><div>> I=E2=80=99m working on a PR to get the= Rust Usdt crate working on FreeBSD. This crate<br></div><div>> basic= ally allow adding DTrace probes to rust sources by compiling the probe d= uring<br></div><div>> macro invocation and embed to a custom section = (set_dtrace_probe) using inline <br></div><div>> assembly.<br></= div><div>> <br></div><div>> The problem I am encountering is = that the linker will optimize the compiled probes<br></div><div>> out= in the custom section, the only workaround I have found is to force the= linker to<br></div><div>> link all the dead code by invoking `-C lin= k-dead-code=3Dyes`. On Illumos, the workaround<br></div><div>> is to = reference another section such that the Illumos linker will not throw th= e probes <br></div><div>> away; however the same workaround does= not work on FreeBSD.<br></div><div>> <br></div><div>> I wond= er if there're any tricks similar to the Illumos fix, by putting some in= line asm there<br></div><div>> to trick the linker and not throw out = the probes.<br></div><div>> <br></div><div>> Thanks In advanc= e,<br></div><div>> Michael<br></div><div>> <br></div><div>>= ; References:<br></div><div>> The PR: <a href=3D"https://github.= com/oxidecomputer/usdt/pull/63">https://github.com/oxidecomputer/usdt/pu= ll/63</a><br></div><div>> The illumos fix: <a href=3D"https://gi= thub.com/oxidecomputer/usdt/blob/eac0fe5f03c3fbf23468ead5cb140f62d51ac3f= 3/usdt-impl/src/record.rs#L251">https://github.com/oxidecomputer/usdt/bl= ob/eac0fe5f03c3fbf23468ead5cb140f62d51ac3f3/usdt-impl/src/record.rs#L251= </a><br></div><div>> <br></div><div>> <br></div><d= iv><br></div><div>GNU as seems to gain support for the "R" flag for sect= ions, which should<br></div><div>prevent them from linker GC. Not = sure if llvm toolchain has this, it<br></div><div>requires both as and l= ld to recognize the flag.<br></div><div><br></div><div>Anyway, try it?&n= bsp; See GNU as documentation for the .section directive,<br></div><div>= ELF type flags.<br></div></blockquote><div><br></div><div>Thanks! This s= eems to solve a big part of the issue.<br></div><div><br></div><div>If i= pass =E2=80=9Ccargo:rustc-link-arg=3D-Xlinker=E2=80=9D and =E2=80=9Ccar= go:rustc-link-arg=3D=E2=80=94no-gc-sections=E2=80=9D it does prevent the= linker from removing the probes.<br></div><div><br></div><div>I am stil= l looking for solutions that does not involve explicit involvement of th= e flags by the crate consumer, and maybe something not turning gc off en= tirely but this is a great progress.<br></div><div><br></div></body></ht= ml> --10660d8e775940ae9e59aa67b16a4e69--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?51c74c5b-731a-445f-be96-0baf6cd0ebe2>