Issue 644 in webp: Undefined symbols for architecture arm64: _SharpYuvConvert

257 views
Skip to first unread message

victo… via monorail

unread,
Jul 3, 2024, 3:43:20 PMJul 3
Status: New
Owner: ----
Labels: Type-Defect Priority-Medium

New issue 644 by victo...@gmail.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644

Trying to compile the [`go-webp`](https://pkg.go.dev/github.com/kolesa-team/go-webp) package using Bazel. This involves compiling [`libwebp`](https://github.com/webmproject/libwebp) from sources.

Here's how I'm retrieving `libwebp`'s sources:

```Starlark
# WORKSPACE
git_repository(
name = "libwebp",
remote = "https://chromium.googlesource.com/webm/libwebp",
commit = "9ce982fdf21764ef7b273f91d6d72721656c3e03",
build_file = "//:bazel/libwebp/BUILD.bazel",
)

# //:bazel/libwebp/BUILD.bazel
filegroup(
name = "srcs",
srcs = glob(
["**/*"],
# https://github.com/bazelbuild/rules_foreign_cc/issues/1034#issuecomment-2009876928
exclude = ["bazel*/**"],
),
visibility = ["//visibility:public"],
)
```

Then, here's how I'm (apparently successfully) compiling it:

```Starlark
# //:external/libwebp/BUILD.bazel
load("@rules_foreign_cc//foreign_cc:defs.bzl", "configure_make")

configure_make(
name = "libwebp",
autogen = True,
configure_in_place = True,
configure_options = [],
env = select({
"@platforms//os:macos": {
"AR": "/usr/bin/ar",
},
"//conditions:default": {},
}),
lib_source = "@libwebp//:srcs",
visibility = ["//visibility:public"],
)
```

Finally, the `go-webp` Go repository:

```
go_repository(
name = "com_github_kolesa_team_go_webp",
importpath = "github.com/kolesa-team/go-webp",
patches = ["//:bazel/com_github_kolesa_team_go_webp/build.patch"], # keep
sum = "h1:wQvU4PLG/X7RS0vAeyhiivhLRoxfLVRlDq4I3frdxIQ=",
version = "v1.0.4",
)
```

Where the patch contains:

```
--- encoder/BUILD.bazel
+++ encoder/BUILD.bazel
@@ -7,7 +7,7 @@
"options.go",
],
cgo = True,
- clinkopts = ["-lwebp"],
+ cdeps = ["@asset-tracker//external/libwebp"],
importpath = "github.com/kolesa-team/go-webp/encoder",
visibility = ["//visibility:public"],
)
```

Trying to build a service that depends on `go-webp` results in linker not finding some symbols from the `webp` library:

```
ld: warning: ignoring duplicate libraries: '-lc++', '-lm'
Undefined symbols for architecture arm64:
"_SharpYuvConvert", referenced from:
_PreprocessARGB in libwebp.a[87](libwebpencode_la-picture_csp_enc.o)
"_SharpYuvGetConversionMatrix", referenced from:
_PreprocessARGB in libwebp.a[87](libwebpencode_la-picture_csp_enc.o)
"_SharpYuvInit", referenced from:
_ImportYUVAFromRGBA in libwebp.a[87](libwebpencode_la-picture_csp_enc.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

link: error running subcommand external/go_sdk/pkg/tool/darwin_arm64/link: exit status 2
```

Some info about my system:

```
Darwin 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:14:38 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6020 arm64
bazel 7.2.1
```

--
You received this message because:
1. The project was configured to send all issue notifications to this address

You may adjust your notification preferences at:
https://bugs.chromium.org/hosting/settings

vrab… via monorail

unread,
Jul 4, 2024, 3:47:25 AMJul 4

Comment #1 on issue 644 by [email protected]: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c1

Issue 645 has been merged into this issue.

jz… via monorail

unread,
Jul 9, 2024, 9:42:39 PMJul 9
Updates:
Labels: Needs-Feedback

Comment #2 on issue 644 by jz...@google.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c2

Thanks for the report. Those symbols come from sharpyuv/sharpyuv.c and sharpyuv/sharpyuv_csp.c. Can you make sure that those are included in the build output from bazel and give the compile command line used? You can also check the contents of libwebp.a with `nm`.

victo… via monorail

unread,
Jul 10, 2024, 4:18:27 AMJul 10

Comment #3 on issue 644 by victo...@gmail.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c3

Hi and thanks for your reply!

In order not to clutter the space here, I created a Gist with the relevant information. Please see https://gist.github.com/barbu110/bc99b76cd86873b6d6e103520cfb724c.

Regarding:


> Can you make sure that those are included in the build output from bazel

The package build file is shown in the Gist I attached. It uses "configure_make", which would seem to actually build it as described in the repository's README.


> give the compile command line used

This I am not sure how to extract from Bazel. Could you please advise?

victo… via monorail

unread,
Jul 10, 2024, 4:23:29 AMJul 10

Comment #4 on issue 644 by victo...@gmail.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c4

Update: By digging a bit with "bazel aquery", I was able to find what looks like the script for building libwebp within my workspaace.

Below is an excerpt:

export MAKE=$EXT_BUILD_ROOT/bazel-out/darwin_arm64-opt-exec-ST-d57f47055a04/bin/external/rules_foreign_cc/toolchains/private/make/bin/make
set -x
AR="/usr/bin/ar" NOCONFIGURE="1" "$BUILD_TMPDIR/autogen.sh"
mkdir -p $BUILD_TMPDIR/$INSTALL_PREFIX
ASFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wthread-safety -Wself-assign -Wunused-but-set-parameter -Wno-free-nonheap-object -fcolor-diagnostics -fno-omit-frame-pointer -mmacosx-version-min=14.4 -no-canonical-prefixes -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted"" CFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wthread-safety -Wself-assign -Wunused-but-set-parameter -Wno-free-nonheap-object -fcolor-diagnostics -fno-omit-frame-pointer -mmacosx-version-min=14.4 -no-canonical-prefixes -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted"" CXXFLAGS="-U_FORTIFY_SOURCE -fstack-protector -Wall -Wthread-safety -Wself-assign -Wunused-but-set-parameter -Wno-free-nonheap-object -fcolor-diagnostics -fno-omit-frame-pointer -std=c++14 -mmacosx-version-min=14.4 -no-canonical-prefixes -Wno-builtin-macro-redefined -D__DATE__="redacted" -D__TIMESTAMP__="redacted" -D__TIME__="redacted"" LDFLAGS="-Wl,-S -mmacosx-version-min=14.4 -no-canonical-prefixes -fobjc-link-runtime -headerpad_max_install_names -lc++ -lm" AR="/usr/bin/ar" CC="$EXT_BUILD_ROOT/external/bazel_tools~cc_configure_extension~local_config_cc/cc_wrapper.sh" CXX="$EXT_BUILD_ROOT/external/bazel_tools~cc_configure_extension~local_config_cc/cc_wrapper.sh" LD="/usr/bin/ld" RANLIB=":" CPPFLAGS="" "$BUILD_TMPDIR/configure" --prefix=$BUILD_TMPDIR/$INSTALL_PREFIX
$EXT_BUILD_ROOT/bazel-out/darwin_arm64-opt-exec-ST-d57f47055a04/bin/external/rules_foreign_cc/toolchains/private/make/bin/make
$EXT_BUILD_ROOT/bazel-out/darwin_arm64-opt-exec-ST-d57f47055a04/bin/external/rules_foreign_cc/toolchains/private/make/bin/make install

Let me know if this is in any way helpful. Thanks!

jz… via monorail

unread,
Jul 10, 2024, 10:03:23 PMJul 10

Comment #5 on issue 644 by jz...@google.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c5


> In order not to clutter the space here, I created a Gist with the relevant information. Please see https://gist.github.com/barbu110/bc99b76cd86873b6d6e103520cfb724c.

The nm output shows the library does not contain the symbols. Reading your initial post I thought the build was pulling sources from the glob, which looks like it would pick up all the files in the tree (**/*.[ch] or src/**/*.[ch] and sharpyuv/*.[ch] are probably enough). If `configure_make` is actually executing configure and running make, then you'll need to add libsharpyuv.a to your link. The sharpyuv files are built into a separate library with configure to allow the functions to be reused elsewhere.


> Update: By digging a bit with "bazel aquery", I was able to find what looks like the script for building libwebp within my workspaace.

Thanks I don't see anything out of the ordinary for the build flags. Another quick way to see the command line for a particular file is to use `--verbose_failures` and add a `#error` to the source file.

victo… via monorail

unread,
Jul 11, 2024, 5:43:51 AMJul 11

Comment #6 on issue 644 by victo...@gmail.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c6

Your pointers were actually super helpful! I managed to get it working by building it as:

--- a/external/libwebp/BUILD.bazel
+++ b/external/libwebp/BUILD.bazel
@@ -17,4 +13,8 @@ configure_make(

}),
lib_source = "@libwebp//:srcs",
visibility = ["//visibility:public"],
+ out_static_libs = [
+ "libwebp.a",
+ "libsharpyuv.a",
+ ],
)

Is there a way we can include some information on building this library through Bazel in the README of the repository?

victo… via monorail

unread,
Jul 11, 2024, 5:46:11 AMJul 11

Comment #7 on issue 644 by victo...@gmail.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c7

So, for completeness sake, my build file now looks like this:


load("@rules_foreign_cc//foreign_cc:defs.bzl", "configure_make")

configure_make(
name = "libwebp",
autogen = True,
configure_in_place = True,
configure_options = [
"--disable-jpeg",
"--disable-tiff",
"--disable-gif",

],
env = select({
"@platforms//os:macos": {
"AR": "/usr/bin/ar",
},
"//conditions:default": {},
}),
lib_source = "@libwebp//:srcs",
visibility = ["//visibility:public"],
out_static_libs = [
"libwebp.a",
"libsharpyuv.a",
]
)

jz… via monorail

unread,
Jul 11, 2024, 4:58:35 PMJul 11
Updates:
Status: Done

Comment #8 on issue 644 by jz...@google.com: Undefined symbols for architecture arm64: _SharpYuvConvert
https://bugs.chromium.org/p/webp/issues/detail?id=644#c8


> Your pointers were actually super helpful! I managed to get it working by building it as:

Thanks for the update. I'm glad you got it to work.


> Is there a way we can include some information on building this library through Bazel in the README of the repository?

Right now there isn't too much to add given we don't maintain a bazel build file for the project. If we did we might go with a direct source/module list rather than configure_make. In your example there are some options being disabled which we might like to retain.

If you have ideas for the documentation or a bazel file please feel free to send a patch:

https://chromium.googlesource.com/webm/libwebp/+/refs/tags/v1.4.0/CONTRIBUTING.md
Reply all
Reply to author
Forward
0 new messages