Skip to content

Commit 99563da

Browse files
committed
Add Linux CI symbol check for mysql component
1 parent a6cfc6d commit 99563da

2 files changed

Lines changed: 110 additions & 0 deletions

File tree

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ jobs:
7979
if: runner.os == 'Linux'
8080
run: cmake --build build --parallel
8181

82+
- name: Verify Linux mysql component dynamic symbols
83+
if: runner.os == 'Linux'
84+
run: scripts/ci/check-linux-mysql-symbols.sh
85+
8286
- name: Build (Windows)
8387
if: runner.os == 'Windows'
8488
run: cmake --build build --config Release --parallel
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
PLUGIN_PATH="${1:-build/src/mysql.so}"
5+
PLUGIN_DIR="$(dirname "${PLUGIN_PATH}")"
6+
BUILD_DIR="$(cd "${PLUGIN_DIR}/.." && pwd)"
7+
8+
if [[ ! -f "${PLUGIN_PATH}" ]]; then
9+
echo "ERROR: plugin not found: ${PLUGIN_PATH}" >&2
10+
exit 1
11+
fi
12+
13+
echo "Checking plugin: ${PLUGIN_PATH}"
14+
15+
if ! readelf -d "${PLUGIN_PATH}" | grep -Fq "Shared library: [libmariadb.so.3]"; then
16+
echo "ERROR: ${PLUGIN_PATH} is missing NEEDED entry for libmariadb.so.3" >&2
17+
readelf -d "${PLUGIN_PATH}" | sed -n '1,120p'
18+
exit 1
19+
fi
20+
21+
LINK_TXT="${PLUGIN_DIR}/CMakeFiles/mysql.dir/link.txt"
22+
MARIADB_PATH=""
23+
24+
if [[ -f "${LINK_TXT}" ]]; then
25+
LINK_CANDIDATE="$(tr ' ' '\n' < "${LINK_TXT}" | grep -E 'libmariadb\.so(\.[0-9]+)*$' | tail -n 1 || true)"
26+
if [[ -n "${LINK_CANDIDATE}" ]]; then
27+
if [[ "${LINK_CANDIDATE}" = /* ]]; then
28+
if [[ -f "${LINK_CANDIDATE}" ]]; then
29+
MARIADB_PATH="${LINK_CANDIDATE}"
30+
fi
31+
else
32+
LINK_BASE_1="$(dirname "${LINK_TXT}")"
33+
LINK_BASE_2="$(dirname "${PLUGIN_PATH}")"
34+
for base in "${LINK_BASE_1}" "${LINK_BASE_2}"; do
35+
CANDIDATE_PATH="$(realpath -m "${base}/${LINK_CANDIDATE}")"
36+
if [[ -f "${CANDIDATE_PATH}" ]]; then
37+
MARIADB_PATH="${CANDIDATE_PATH}"
38+
break
39+
fi
40+
done
41+
fi
42+
fi
43+
fi
44+
45+
if [[ -z "${MARIADB_PATH}" || ! -f "${MARIADB_PATH}" ]]; then
46+
RUNPATH_DIRS="$(
47+
readelf -d "${PLUGIN_PATH}" \
48+
| awk -F'[][]' '/(RUNPATH|RPATH)/ { print $2 }' \
49+
| head -n 1 || true
50+
)"
51+
if [[ -n "${RUNPATH_DIRS}" ]]; then
52+
OLD_IFS="${IFS}"
53+
IFS=':'
54+
for dir in ${RUNPATH_DIRS}; do
55+
if [[ -f "${dir}/libmariadb.so.3" ]]; then
56+
MARIADB_PATH="${dir}/libmariadb.so.3"
57+
break
58+
fi
59+
done
60+
IFS="${OLD_IFS}"
61+
fi
62+
fi
63+
64+
if [[ -z "${MARIADB_PATH}" || ! -f "${MARIADB_PATH}" ]]; then
65+
MARIADB_PATH="$(find "${BUILD_DIR}" libs/mariadb-connector-c -type f -name 'libmariadb.so.3' 2>/dev/null | head -n 1 || true)"
66+
fi
67+
68+
if [[ -z "${MARIADB_PATH}" || ! -f "${MARIADB_PATH}" ]]; then
69+
echo "ERROR: could not locate linked libmariadb.so.3 in build output" >&2
70+
exit 1
71+
fi
72+
73+
echo "Checking linked MariaDB library: ${MARIADB_PATH}"
74+
75+
TMP_DIR="$(mktemp -d)"
76+
trap 'rm -rf "${TMP_DIR}"' EXIT
77+
78+
nm -D "${PLUGIN_PATH}" \
79+
| awk '/ U mysql_/ { print $3 }' \
80+
| sed 's/@.*//' \
81+
| LC_ALL=C sort -u > "${TMP_DIR}/mysql_imports.txt"
82+
83+
nm -D --defined-only "${MARIADB_PATH}" \
84+
| awk '{ print $3 }' \
85+
| sed 's/@.*//' \
86+
| grep -E '^mysql_' \
87+
| LC_ALL=C sort -u > "${TMP_DIR}/mysql_exports.txt"
88+
89+
if [[ ! -s "${TMP_DIR}/mysql_imports.txt" ]]; then
90+
echo "ERROR: no imported mysql_* symbols found in ${PLUGIN_PATH}" >&2
91+
exit 1
92+
fi
93+
94+
MISSING_COUNT="$(
95+
LC_ALL=C comm -23 "${TMP_DIR}/mysql_imports.txt" "${TMP_DIR}/mysql_exports.txt" \
96+
| tee "${TMP_DIR}/mysql_missing.txt" \
97+
| wc -l
98+
)"
99+
100+
if [[ "${MISSING_COUNT}" -ne 0 ]]; then
101+
echo "ERROR: linked libmariadb is missing exported mysql_* symbols required by plugin:" >&2
102+
sed -n '1,200p' "${TMP_DIR}/mysql_missing.txt" >&2
103+
exit 1
104+
fi
105+
106+
echo "OK: mysql.so imports resolve against exported symbols in libmariadb.so.3"

0 commit comments

Comments
 (0)