diff --git a/src/csharp/Grpc.Core.NativeDebug/Grpc.Core.NativeDebug.csproj b/src/csharp/Grpc.Core.NativeDebug/Grpc.Core.NativeDebug.csproj
index f2b773816a7..122d8ef0b18 100644
--- a/src/csharp/Grpc.Core.NativeDebug/Grpc.Core.NativeDebug.csproj
+++ b/src/csharp/Grpc.Core.NativeDebug/Grpc.Core.NativeDebug.csproj
@@ -2,7 +2,7 @@
The gRPC Authors
Copyright 2015 The gRPC Authors
- Debug symbols for the native library contained in Grpc.Core
+ Debug symbols for the grpc_csharp_ext native library contained in Grpc.Core
https://github.com/grpc/grpc.github.io/raw/master/img/grpc_square_reverse_4x.png
Apache-2.0
https://github.com/grpc/grpc
@@ -18,6 +18,14 @@
+
+ runtimes/linux-x64/native/libgrpc_csharp_ext.x64.dbginfo.so
+ true
+
+
+ runtimes/linux-arm64/native/libgrpc_csharp_ext.arm64.dbginfo.so
+ true
+
runtimes/win-x86/native/grpc_csharp_ext.x86.dll
true
diff --git a/tools/dockerfile/grpc_artifact_python_manylinux2014_aarch64/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux2014_aarch64/Dockerfile
index c5c0d46332b..db98443797e 100644
--- a/tools/dockerfile/grpc_artifact_python_manylinux2014_aarch64/Dockerfile
+++ b/tools/dockerfile/grpc_artifact_python_manylinux2014_aarch64/Dockerfile
@@ -26,3 +26,10 @@ RUN /opt/python/cp36-cp36m/bin/pip install --upgrade cython
RUN /opt/python/cp37-cp37m/bin/pip install --upgrade cython
RUN /opt/python/cp38-cp38/bin/pip install --upgrade cython
RUN /opt/python/cp39-cp39/bin/pip install --upgrade cython
+
+# the dockcross docker image sets variables like CC, CXX etc.
+# to point to the crosscompilation toolchain, but doesn't set corresponding
+# variables for the "strip" and "objcopy" tools.
+# see https://github.com/dockcross/dockcross/blob/4349cb4999401cbf22a90f46f5052d29be240e50/manylinux2014-aarch64/Dockerfile.in#L23
+ENV STRIP=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-strip \
+ OBJCOPY=${CROSS_ROOT}/bin/${CROSS_TRIPLE}-objcopy
diff --git a/tools/internal_ci/linux/grpc_build_artifacts.cfg b/tools/internal_ci/linux/grpc_build_artifacts.cfg
index 1e04a1e7880..433860ffe32 100644
--- a/tools/internal_ci/linux/grpc_build_artifacts.cfg
+++ b/tools/internal_ci/linux/grpc_build_artifacts.cfg
@@ -16,7 +16,7 @@
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/linux/grpc_build_artifacts.sh"
-timeout_mins: 120
+timeout_mins: 180
action {
define_artifacts {
regex: "**/*sponge_log.*"
diff --git a/tools/run_tests/artifacts/build_artifact_csharp.sh b/tools/run_tests/artifacts/build_artifact_csharp.sh
index bcec73951aa..3ea389fe4b5 100755
--- a/tools/run_tests/artifacts/build_artifact_csharp.sh
+++ b/tools/run_tests/artifacts/build_artifact_csharp.sh
@@ -26,7 +26,23 @@ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
../..
make grpc_csharp_ext -j2
+
+if [ -f "libgrpc_csharp_ext.so" ]
+then
+ # in case we are in a crosscompilation environment
+ STRIP=${STRIP:-strip}
+ OBJCOPY=${OBJCOPY:-objcopy}
+
+ # The .so file with all debug symbols is too large to
+ # package in the default nuget package.
+ # But we still want to keep the version with symbols
+ # to include it in a special "debug" package.
+ cp libgrpc_csharp_ext.so libgrpc_csharp_ext.dbginfo.so
+ ${STRIP} --strip-unneeded libgrpc_csharp_ext.so
+ ${OBJCOPY} --add-gnu-debuglink=libgrpc_csharp_ext.dbginfo.so libgrpc_csharp_ext.so
+fi
+
cd ../..
mkdir -p "${ARTIFACTS_OUT}"
-cp cmake/build/libgrpc_csharp_ext.so "${ARTIFACTS_OUT}" || cp cmake/build/libgrpc_csharp_ext.dylib "${ARTIFACTS_OUT}"
+cp cmake/build/libgrpc_csharp_ext.so cmake/build/libgrpc_csharp_ext.dbginfo.so "${ARTIFACTS_OUT}" || cp cmake/build/libgrpc_csharp_ext.dylib "${ARTIFACTS_OUT}"