Skip site navigation (1)Skip section navigation (2)
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>&gt; Hi everyone,<br></div><=
div>&gt;&nbsp;<br></div><div>&gt; I=E2=80=99m working on a PR to get the=
 Rust Usdt crate working on FreeBSD. This crate<br></div><div>&gt; basic=
ally allow adding DTrace probes to rust sources by compiling the probe d=
uring<br></div><div>&gt; macro invocation and embed to a custom section =
(set_dtrace_probe) using inline&nbsp;<br></div><div>&gt; assembly.<br></=
div><div>&gt;&nbsp;<br></div><div>&gt; The problem I am encountering is =
that the linker will optimize the compiled probes<br></div><div>&gt; out=
 in the custom section, the only workaround I have found is to force the=
 linker to<br></div><div>&gt; link all the dead code by invoking `-C lin=
k-dead-code=3Dyes`. On Illumos, the workaround<br></div><div>&gt; is to =
reference another section such that the Illumos linker will not throw th=
e probes&nbsp;<br></div><div>&gt; away; however the same workaround does=
 not work on FreeBSD.<br></div><div>&gt;&nbsp;<br></div><div>&gt; I wond=
er if there're any tricks similar to the Illumos fix, by putting some in=
line asm there<br></div><div>&gt; to trick the linker and not throw out =
the probes.<br></div><div>&gt;&nbsp;<br></div><div>&gt; Thanks In advanc=
e,<br></div><div>&gt; Michael<br></div><div>&gt;&nbsp;<br></div><div>&gt=
; References:<br></div><div>&gt; The PR:&nbsp;<a href=3D"https://github.=
com/oxidecomputer/usdt/pull/63">https://github.com/oxidecomputer/usdt/pu=
ll/63</a><br></div><div>&gt; The illumos fix:&nbsp;<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>&gt;&nbsp;<br></div><div>&gt;&nbsp;&nbsp;<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.&nbsp; 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>