On Wed, Jun 17, 2020 at 02:33:49PM -0600, Jason A. Donenfeld wrote: > So, some more research: it looks like the R_ARM_THM_JUMP11 symbol is > actually wg_packet_send_staged_packets, a boring C function with > nothing fancy about it. That github issue you pointed to suggested > that it might have something to do with complex crypto functions, but > it looks like that's not the case. wg_packet_send_staged_packets is > plain old boring C. > > But there is one interesting thing about > wg_packet_send_staged_packets: it's defined in send.c, and called from > send.c, receive.c, device.c, and netlink.c -- four places. What I > suspect is happening is that the linker can't quite figure out how to > order the functions in the final executable so that the > wg_packet_send_staged_packets definition is sufficiently close to all > of its call sites, so it then needs to add that extra trampoline > midway to get to it. Stupid linker. I'm playing now if there's some > manual reordering I can do in the build system so that this isn't a > problem, but I'm not very optimistic that I'll succeed.
Looks like my explanation there wasn't 100% accurate, but it does seem like the issue occurs when gcc sees a clear tail call that it can optimize into a B instruction instead of a BL instruction. The below patch avoids that, and thus fixes your issue, using a pretty bad trick that's not really suitable for being committed anywhere, but it is perhaps leading us in the right direction: diff --git a/src/send.c b/src/send.c index 828b086a..4bb6911f 100644 --- a/src/send.c +++ b/src/send.c @@ -221,6 +221,8 @@ static bool encrypt_packet(struct sk_buff *skb, struct noise_keypair *keypair, simd_context); } +volatile char dummy; + void wg_packet_send_keepalive(struct wg_peer *peer) { struct sk_buff *skb; @@ -240,6 +242,7 @@ void wg_packet_send_keepalive(struct wg_peer *peer) } wg_packet_send_staged_packets(peer); + dummy = -1; } static void wg_packet_create_data_done(struct sk_buff *first, _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel