意外执行链接到 libavformat 的最小 Cgo 应用程序
Unexpected execution of minimal Cgo application linked to libavformat
我有一个最小的 C 程序
#include <libavformat/avformat.h>
AVFormatContext *open(const char *url) {
printf("URL %s\n", url);
AVFormatContext *ctx = NULL;
int err = avformat_open_input(&ctx, url, 0, 0);
return ctx;
}
int main(int argc, char **argv) {
open(argv[1]);
}
有效,它打印我传入的文件路径,以及 returns 有效的 AVFormatContext。
我将代码粘贴到 Golang 程序中:
package main
// #include <libavformat/avformat.h>
// AVFormatContext *open(const char *url) {
// printf("URL %s\n", url);
// AVFormatContext *ctx = NULL;
// int err = avformat_open_input(&ctx, url, 0, 0);
// return ctx;
// }
// #cgo LDFLAGS: -lavformat
import "C"
import (
"fmt"
"os"
)
func main() {
fmt.Println("Lets try this")
url := os.Args[1]
C.open(C.CString(url))
}
这会打印 URL /dev/urandom
(无论我给它什么参数)并挂起。非常奇怪的是,它不打印 Lets try this
。
这是在 Mac 上使用 ffmpeg 并来自自制软件:
ffmpeg version 4.2.1
Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.8)
go version go1.13.4 darwin/amd64
我目前的猜测是编译器 ABI 不兼容,或者可能是 libavformat 运行 main() 之前的东西?
问题出在函数名称 open
上。它屏蔽了打开的系统调用,go 必须在它到达 main 之前调用。
我有一个最小的 C 程序
#include <libavformat/avformat.h>
AVFormatContext *open(const char *url) {
printf("URL %s\n", url);
AVFormatContext *ctx = NULL;
int err = avformat_open_input(&ctx, url, 0, 0);
return ctx;
}
int main(int argc, char **argv) {
open(argv[1]);
}
有效,它打印我传入的文件路径,以及 returns 有效的 AVFormatContext。
我将代码粘贴到 Golang 程序中:
package main
// #include <libavformat/avformat.h>
// AVFormatContext *open(const char *url) {
// printf("URL %s\n", url);
// AVFormatContext *ctx = NULL;
// int err = avformat_open_input(&ctx, url, 0, 0);
// return ctx;
// }
// #cgo LDFLAGS: -lavformat
import "C"
import (
"fmt"
"os"
)
func main() {
fmt.Println("Lets try this")
url := os.Args[1]
C.open(C.CString(url))
}
这会打印 URL /dev/urandom
(无论我给它什么参数)并挂起。非常奇怪的是,它不打印 Lets try this
。
这是在 Mac 上使用 ffmpeg 并来自自制软件:
ffmpeg version 4.2.1
Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.8)
go version go1.13.4 darwin/amd64
我目前的猜测是编译器 ABI 不兼容,或者可能是 libavformat 运行 main() 之前的东西?
问题出在函数名称 open
上。它屏蔽了打开的系统调用,go 必须在它到达 main 之前调用。